从video中提取特定帧的最快方法(PHP / ffmpeg /任何东西)

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

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

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

…它工作得很好,除了它像糖蜜一样慢。 我的猜测是,ffmpeg对于这个工作来说有点太过分了,而且我可以通过利用底层库或者其他东西来做得更好……但是我不知道该怎么做。

理想情况下,我不想安装任何需要真正的“安装过程”的东西…即,将可执行文件放到我的web应用程序的文件夹中是好的,但我宁愿不必实际运行安装程序。 此外,解决scheme应该能够在Mac,Linux和Windows上运行(尽pipeLinux是最重要的)。

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

谢谢。

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

相反,您应该首先考虑在快速寻找模式(或快速/精确混合模式)下使用ffmpeg。 他们的维基讲述了快速寻找:

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

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

这个例子会在电影开始的第三分钟左右的时候产生一个图像帧(out1.jpg)。 input将使用关键帧进行分析,这非常快速。 缺点是它也会在某些关键帧完成search,而不一定是在指定的时间(00:03:00),所以search不会像预期的那么精确。

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

编辑14/06/10

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

所以对于2.1+,在重新编码(而保存为.jpeg是重新编码)时,不应再需要“混合”search来获得准确的结果。 按照平常的快速搜寻( -ss ... -i ... )而不是慢搜寻( -i ... -ss ... )就足够了。