在上传到远程网站期间缩小/调整视频大小

时间:2012-04-16 14:14:20

标签: javascript ruby-on-rails video upload

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

2 个答案:

答案 0 :(得分:2)

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

对于HTML5中的更改,如果您可以克服多个问题,理论上可能

  • 您可以使用File API来读取用户使用<input type="file">元素选择的文件的内容。但是,看起来FileReader整个文件读入内存,然后再将其移交给您的代码,这正是您在处理大型视频文件时不想要的。不幸的是,这是一个你无能为力的问题。它可能仍然有效,但对于超过10-20 MB的任何东西,性能可能都是不可接受的。
  • 一旦你拥有了文件的数据,你就必须解释它 - 通常用demuxer来完成,将continer(mpeg等)文件分割成视频和音频流,和codec将这些流解压缩为原始图像/音频数据。您的操作系统附带了几个编解码器实现,其中没有一个可以从JavaScript访问。有一些JS video and audio codec实现,但它们是实验性的,并且非常缓慢;并且只实现 解压缩程序 ,因此在创建输出时会遇到困难。
  • 解压缩,缩放和重新压缩音频和视频是非常处理器密集型,这是JavaScript(以及一般的脚本语言)最糟糕的工作量。至少,您必须使用Web workers在单独的线程上运行代码。
  • 所有这些工作都已完成several times over;你正在重新发明轮子。

实际上,这是必须在服务器端完成的事情,即便如此,这也不是一项微不足道的努力。

如果你是绝望的,你可以尝试像处理压缩的插件/ ActiveX控件,但是你必须说服用户安装插件(yuck)。

答案 1 :(得分:1)

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

否则你可能只是让Carrierwave从头开始处理该文件(除非您使用Heroku进行托管,并且需要通过直接转到S3来避免超时)。