使用 ffmpeg 从视频中每 n 帧选择一个

使用 ffmpeg 从视频中每 n 帧选择一个

我尝试使用 ffmpeg 从视频中每 N 帧提取一个。我尝试使用以下命令: ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" 1_every_10/img_%03d.jpg

我想验证它是否按预期工作。因此我使用以下命令提取所有帧:

ffmpeg -i input.mp4 -vf "select=not(mod(n\,1))" all/img_%03d.jpg

然后我尝试查看第一个命令中的第二张图片是否与第二个命令中的第 20 张图片匹配,结果不匹配。通过视觉和 diff 命令确认了这一点,例如

diff all/img_020.jpg 1_every_10/img_002.jpg Binary files all/img_020.jpg and 1_every_10/img_002.jpg differ

有人知道发生了什么吗?谢谢!

答案1

image2 复用器默认为恒定帧速率。因此,如果输入为 30 fps,并且您选择每 10 帧,即时间戳为 0s、0.33s、0.66s 的帧...,则 ffmpeg 将复制帧以匹配输入速率,因此每个输入帧将复制 9 帧。

避免这种情况的方法是将视频同步方法设置为直通或可变帧速率

例如

ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr 1_every_10/img_%03d.jpg

如果输入是 VFR,这可能会影响完整提取。因此,使用

ffmpeg -i input.mp4 -vf select -vsync vfr all/img_%03d.jpg

相关内容