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

Javascript 在上传到远程网站期间缩小/调整视频大小,javascript,ruby-on-rails,video,upload,Javascript,Ruby On Rails,Video,Upload,我有一个用Ruby on rails编写的web应用程序,它使用表单将视频从用户上传到服务器(我实际上使用了一个jquery上传程序,直接上传到s3,但我认为这与此无关)。 为了减少视频的上传时间,我想缩小它的大小,例如,如果视频大小为1000x2000像素,我想缩小到500x1000。在客户端上传视频时,有没有办法做到这一点?有javascript库可以做到这一点吗 你可以使用像Carrierwave这样的宝石(https://github.com/jnicklas/carrierwave).

我有一个用Ruby on rails编写的web应用程序,它使用表单将视频从用户上传到服务器(我实际上使用了一个jquery上传程序,直接上传到s3,但我认为这与此无关)。

为了减少视频的上传时间,我想缩小它的大小,例如,如果视频大小为1000x2000像素,我想缩小到500x1000。在客户端上传视频时,有没有办法做到这一点?有javascript库可以做到这一点吗

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


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

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

随着HTML5的变化,如果您能够克服以下几个问题,理论上是可能的:

  • 您可以使用读取用户使用
    元素选择的文件内容。但是,它看起来像是在将整个文件移交给代码之前将其读取到内存中,这正是处理大型视频文件时您不希望看到的。不幸的是,这是一个你无能为力的问题。它可能仍然可以工作,但对于任何超过10-20MB的内存,性能可能都是不可接受的
  • 一旦你有了文件的数据,你就必须对它进行实际的解释——这通常是通过将continer(mpeg等)文件分割成视频和音频流,以及将这些流解压缩成原始图像/音频数据来完成的。您的操作系统附带了多个编解码器实现,没有一个可以通过JavaScript访问。有一些JS实现,但它们是实验性的,速度非常慢;并且只实现解压器,因此在创建输出时,您将陷入困境
  • 解压缩、缩放和重新压缩音频和视频是处理器密集型的,这正是JavaScript(以及一般的脚本语言)最糟糕的工作负载。至少,您必须使用在单独的线程上运行代码
  • 所有这些工作都已完成;你在重新发明轮子
事实上,这是必须在服务器端完成的事情,即使这样,这也不是一项微不足道的工作


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

谢谢,但这只有在电影上传后才会发生。我基本上想在文件离开用户机器之前完成这项工作,也就是说,当文件流到服务器或客户端机器上时,我怀疑这是不可能的。我无法想象你能在客户端完成它,如果你能在没有完整文件的情况下完成它,我也会感到惊讶。我当然可能是错的,如果是这样的话,毫无疑问这里会有人告诉我们。起初我认为这是不可能的,但YouTube似乎可以在你上传视频时做到这一点,所以我想有一种方法。目前,我正在服务器端调整大小和转换,我只是想在客户端上传之前完成。我刚刚尝试上传到YouTube——发送到服务器的数据与我硬盘上的视频文件的字节相同,因此肯定没有进行任何客户端压缩。请参阅此处的答案: