51

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

我当前的解决方案是使用 phpexec命令:

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

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

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

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

谢谢。

4

1 回答 1

82

当然,您可以编写一些 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 在搜索期间实际上不需要解码(大部分)电影,而快速/准确混合模式是一个很好的折衷方案。阅读wiki 页面以了解所有可用选项。

编辑 10 年 6 月 14 日

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

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

于 2013-08-30T18:39:37.843 回答