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

Pra*_*ngo 5 ffmpeg

我试图使用 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

有谁知道会发生什么?谢谢!

Gya*_*yan 6

image2 muxer 默认为恒定帧速率。因此,如果输入为 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
Run Code Online (Sandbox Code Playgroud)

如果输入是 VFR,这可能会影响完全提取。所以,使用

ffmpeg -i input.mp4 -vf select -vsync vfr all/img_%03d.jpg
Run Code Online (Sandbox Code Playgroud)