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

时间:2013-08-30 14:02:12

标签: php video ffmpeg mp4 video-processing

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

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

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

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

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

我可以做些什么来加快这个过程?

感谢。

1 个答案:

答案 0 :(得分:71)

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

相反,您应首先考虑在快速搜索模式(或快速/准确混合模式)中使用ffmpeg。关于快速寻求的Their wiki states

  

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

     

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

     

此示例将在某处生成一个图像帧(out1.jpg)   从电影开始的第三分钟。输入将是   使用关键帧解析,速度非常快。缺点是它   也将完成对某些关键帧的搜索,不一定位于   在指定的时间(00:03:00),所以寻求不会那么准确   如预期的那样。

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

编辑14/06/10

  

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

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