我是命令行新手。学习命令行很酷也很刺激,但我有点卡住了。
例如,我有一个视频,我想每 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)
为间隔(以秒为单位)。将8
inld(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.mp4
为output-%04d.png
— 您将获得连续编号的 PNG。