5

我有一个用 Ruby on rails 编写的 Web 应用程序,它使用表单将用户的视频上传到服务器(我实际上使用了一个直接上传到 s3 的 jquery 上传器,但我认为这不相关)。
为了减少视频的上传时间,我想缩小它,例如,如果视频大小是 1000x2000 像素,我想将它缩小到 500x1000。有没有办法在客户端上传视频时这样做?有没有可以做到这一点的javascript库?

4

2 回答 2

2

重新压缩视频是一个重要的问题,不会很快在浏览器中发生。

随着 HTML5 的变化,如果你能克服几个问题,理论上是有可能的:

  • 您将使用File API来读取用户使用<input type="file">元素选择的文件的内容。但是,看起来在将整个文件交给您的代码之前将整个文件FileReader入内存,这正是您在处理大型视频文件时不想要的。不幸的是,这是一个您无能为力的问题。它可能仍然可以工作,但是对于超过 10-20 MB 左右的任何东西,性能可能是不可接受的。
  • 一旦你有了文件的数据,你就必须实际解释它——这通常通过解复用器来完成,将continer(mpeg 等)文件拆分为视频和音频流,并使用编解码器将这些流解压缩为原始图像/音频数据。您的操作系统带有多个编解码器的实现,它们都不能从 JavaScript 访问。有一些 JS视频 音频 编解码器的实现,但是它们是实验性的并且非常缓慢;并且只实现decompressor,所以在创建输出时你会被卡住。
  • 解压缩、缩放和重新压缩音频和视频是极其占用处理器资源的,这正是 JavaScript(以及一般的脚本语言)最不擅长的工作负载。至少,您必须使用Web 工作者在单独的线程上运行您的代码。
  • 所有这些工作已经完成 几次 ;你在重新发明轮子。

实际上,这是必须在服务器端完成的事情,即便如此,这也不是一件容易的事。

如果你很绝望,你可以尝试使用插件/ActiveX 控件来处理压缩,但你必须说服用户安装插件(糟糕)。

于 2012-04-16T15:50:20.540 回答
1

您可以使用像 Carrierwave (https://github.com/jnicklas/carrierwave) 这样的 gem。它具有在存储文件之前处理文件的能力。即使您首先使用 javascript 将它们直接上传到 S3,您也可以让 Carrierwave 检索文件、处理它并再次存储它。

否则,您可以让 Carrierwave 从一开始就处理文件(除非您使用 Heroku 托管并且需要通过直接访问 S3 来避免超时)。

于 2012-04-16T14:19:22.120 回答