从视频中提取特定帧的最快方法(PHP/ffmpeg/anything)

Dan*_*anM 47 php video mp4 ffmpeg video-processing

我有一个网页,其中(除其他外)需要从用户上传的视频中提取特定的框架.用户在播放器中寻找.mp4的特定部分,然后单击一个按钮,ajax调用被激活到一个PHP脚本,该脚本获取.mp4,以及视频的确切时间,并使用它来提取一个"缩略图"框架.

我目前的解决方案是使用php exec命令:

exec("ffmpeg -i $videoPath -ss $timeOffset -vframes 1 $jpgOutputPath");

......效果很好,除了它和糖蜜一样慢.我的猜测是ffmpeg对于这项工作来说有点太多了,我可以通过利用底层库或其他东西做得更好......但是我不知道如何做到这一点.

理想情况下,我不想安装任何需要真正"安装过程"的东西......即,使用我的网络应用程序将可执行文件放入文件夹中很好,但我宁愿不必实际运行安装程序.此外,解决方案应该能够在mac,linux和windows上运行(尽管linux是首要任务).

我该怎么做才能加快这个过程?

谢谢.

nma*_*ier 74

当然你可以编写一些C/C++并链接到-lav*,基本上创建一个简化版本的ffmpeg只是为了提取帧,甚至可能作为一个php扩展(我也不会把它作为同一个用户运行) ,更不用说在同一个过程中).但结果不太可能更快,因为你只会避免一些分叉和设置开销,但你可能的问题实际上是解码,这仍然是相同的.

相反,您应首先考虑在快速搜索模式(或快速/准确混合模式)中使用ffmpeg.他们的wiki说快速寻求:

-ss参数需要在-i之前指定:

ffmpeg -ss 00:03:00 -i Underworld.Awakening.avi -frames:v 1 out1.jpg

这个例子将在电影开头的第三分钟左右产生一个图像帧(out1.jpg).输入将使用关键帧进行解析,速度非常快.缺点是它也将在某个关键帧处完成搜索,不一定位于指定的时间(00:03:00),因此搜索不会像预期的那样准确.

快速搜索不太准确,但速度快得多,因为ffmpeg实际上不需要在搜索期间解码(大部分)电影,而快速/准确的混合模式是很好的折衷.阅读维基页面以获取所有可用选项.

编辑14/06/10:

从FFmpeg 2.1开始,当使用ffmpeg进行代码转换(即不是流复制)时,即使用作输入选项,-ss现在也是准确的.可以使用-noaccurate_seek选项恢复以前的行为. (资源)

因此,对于2.1+,当重新编​​码(并且保存为.jpeg重新编码)时,不再需要"混合"搜索以获得准确的结果.通常快速搜索(-ss ... -i ...)而不是慢速搜索(-i ... -ss ...)就足够了.

  • 快速搜索似乎也适用于远程视频,例如通过http或https. (5认同)
  • 执行时间的差异约为20分钟(3GB视频)。保存了这一天。 (2认同)