在上传到远程网站期间缩小/调整视频大小
Posted
技术标签:
【中文标题】在上传到远程网站期间缩小/调整视频大小【英文标题】:Downscaling/resizing a video during upload to a remote website 【发布时间】:2012-04-27 21:10:18 【问题描述】:我有一个用 Ruby on rails 编写的 Web 应用程序,它使用表单将用户的视频上传到服务器(我实际上使用了一个直接上传到 s3 的 jquery 上传器,但我认为这不相关)。 为了减少视频的上传时间,我想缩小它,例如如果视频大小为 1000x2000 像素,我想将其缩小到 500x1000。有没有办法在客户端上传视频时这样做?有没有可以做到这一点的javascript库?
【问题讨论】:
在这里查看答案:***.com/questions/31316791/… 【参考方案1】:您可以使用像 Carrierwave (https://github.com/jnicklas/carrierwave) 这样的 gem。它具有在存储文件之前处理文件的能力。即使您首先使用 javascript 将它们直接上传到 S3,您也可以让 Carrierwave 检索文件、处理它并再次存储它。
否则,您可以让 Carrierwave 从一开始就处理文件(除非您使用 Heroku 托管并且需要通过直接转到 S3 来避免超时)。
【讨论】:
谢谢,但这只会在电影上传后发生。我基本上想在文件离开用户机器之前完成它,这意味着当它流式传输到服务器或客户端机器上时 我怀疑这是不可能的。我无法想象你可以在客户端做到这一点,如果你能在没有整个文件的情况下做到这一点,我也会感到惊讶。我当然可能是错的,如果是这样的话,毫无疑问这里有人会启发我们。【参考方案2】:重新压缩视频是一个重要的问题,不会很快在浏览器中发生。
随着 html5 的变化,如果你能克服几个问题,理论上是可能的:
您可以使用File API 来读取用户使用<input type="file">
元素选择的文件的内容。但是,看起来FileReader
在将其交给您的代码之前将整个文件读入内存,这正是您在处理大型视频文件时不想要的。不幸的是,这是一个您无能为力的问题。它可能仍然有效,但对于超过 10-20 MB 左右的任何内容,性能可能无法接受。
一旦你有了文件的数据,你就必须真正解释它——这通常是通过demuxer 将 continer(mpeg 等)文件拆分为视频和音频流,以及codec 将这些流解压缩为原始图像/音频数据。您的操作系统带有多个编解码器的实现,它们都不能从 JavaScript 访问。有一些 JS video and audio codec 实现,但它们是实验性的并且非常缓慢;并且只实现 decompressor,所以在创建输出时会卡住。
解压缩、缩放和重新压缩音频和视频是非常处理器密集型的,这正是 JavaScript(以及一般的脚本语言)最不擅长的工作负载。至少,您必须使用 Web workers 在单独的线程上运行您的代码。
所有这些工作已经完成severaltimesover;你在重新发明***。
实际上,这是必须在服务器端完成的事情,即便如此,这也不是一件容易的事。
如果您不顾一切,您可以尝试处理压缩的插件/ActiveX 控件之类的东西,但是您必须说服用户安装插件(糟糕)。
【讨论】:
起初我认为这是不可能的,但当你上传视频时,YouTube 似乎能够做到这一点,所以我想有办法。目前我正在服务器端调整大小和转换我只是希望能够在从客户端上传之前做到这一点 我刚刚尝试上传到 YouTube - 发送到服务器的数据与我硬盘上的视频文件字节相同,所以肯定没有任何客户端压缩。以上是关于在上传到远程网站期间缩小/调整视频大小的主要内容,如果未能解决你的问题,请参考以下文章