如何使用 FFmpeg 每 X 秒捕获第一个 X 帧并保存为 PNG?

如何使用 FFmpeg 每 X 秒捕获第一个 X 帧并保存为 PNG?

我是命令行新手。学习命令行很酷也很刺激,但我有点卡住了。

例如,我有一个视频,我想每 5 秒捕获一次前 8 帧以制作图像。

我写了这个命令:

ffmpeg -i video.mp4 -vf fps=8/20 out%04d.png

我发现它每 20 秒捕获 8 帧,而不是前 8 帧。我可以在命令中指定这一点吗?

答案1

这是选择过滤器的通用版本,每 5 秒选择 8 帧。

ffmpeg -i in.mp4 -vf "select='if(not(floor(mod(t,5)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+8),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 out%d.png 

这适用于任何帧速率(恒定或可变)的视频。

5将in更改mod(t,5)为间隔(以秒为单位)。将8inld(2)+8更改为要选择的帧数。

答案2

您可以使用select过滤器选择与表达式匹配的帧。如果表达式的计算结果为非零数字或true,它将选择这些帧。例如,如果您的过滤器是-vf select="between(n\, 0\, 7)",它将选择前八帧。帧编号为n,从零开始。

将其与mod(模数)运算符相结合,您可以选择每组(比如说 24 帧)的前八帧,因此对于 24 fps 的视频,每秒选择前八帧:

ffmpeg -i input.mp4 -vf "select=between(mod(n\, 24)\, 0\, 7), setpts=N/24/TB" output.mp4

需要过滤setpts器来调整帧的时间戳,以便视频中没有间隙。

要获取每五秒的前八帧,将 24 乘以 5:

ffmpeg -i input.mp4 -vf "select=between(mod(n\, 120)\, 0\, 7), setpts=N/24/TB" output.mp4

要将所有内容输出为 PNG,请将输出从 更改output.mp4output-%04d.png— 您将获得连续编号的 PNG。

相关内容