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

Downscaling/resizing a video during upload to a remote website

本文关键字:缩小 调整 视频 网站 程网站      更新时间:2023-09-26

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

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

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

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

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

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

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

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

相关文章: