我一直在使用FFmpeg将单帧提取到图像中。虽然有一些谷歌搜索,但结果是运行:
ffmpeg.exe -i video.avi -ss 00:30:00 -y -an -vframes 1 test.png
...运行速度明显慢于以下速度,几乎完全相同,但是瞬间:
ffmpeg.exe -ss 00:30:00 -i video.avi -y -an -vframes 1 test.png
唯一的区别是-i和-ss的顺序。这是故意的“功能”吗?这有什么不同的技术原因吗?
答案 0 :(得分:7)
这是一个有根据的猜测。当-ss
出现在-i
之前时,它会被视为输入的说明,因此视频流的第一帧是30秒的帧。在-ss
之后发生-i
时,会将其视为效果,并且会读取和删除前30秒的帧,从而导致性能差异。
答案 1 :(得分:7)
' - ss位置(输入/输出)'
当用作输入选项(在-i之前)时,在此输入文件中寻找位置。当用作输出选项(在输出文件名之前)时,解码但丢弃输入,直到时间戳到达位置。这比较慢,但更准确。
(位置可以是秒或hh:mm:ss [.xxx]形式。)
我目前正在编写一个音频采集应用程序,因此,我正在使用更慢但更准确的方法。您可以选择最佳方法。
答案 2 :(得分:2)
当-ss出现在-i之前时,它会转到最近的关键帧(在H.264文件中每10秒钟25帧,因为H.264将使用250的GOP)。这使得搜索速度非常快,因此您可以在-i之后添加另一个-ss,以便在第一个-ss之后转到小数位置。
在-i之后使用-i将寻找确切的位置,但它非常慢。
有关示例和更多信息,请参阅https://trac.ffmpeg.org/wiki/Seeking
答案 3 :(得分:2)
我刚刚完成了一个从视频内容生成缩略图的应用程序。
你应该看看这个, http://ffmpeg.org/trac/ffmpeg/wiki/Seeking%20with%20FFmpeg
它描述了一种方法,将-ss
标志(来自两个位置)组合成一个统一的命令,提供帧time
的准确性,以及更快的帧选择。
ffmpeg -ss 00:02:30 -i Underworld.Awakening.avi -ss 00:00:30 -vframes 1 out3.jpg
并且还包含指向其他可能技巧的链接,例如来自单个视频的多个拇指。