Video ffmpeg:如果超过阈值,则减少fps;如果低于阈值,则不增加fps
ffmpeg CLI允许您指定Video ffmpeg:如果超过阈值,则减少fps;如果低于阈值,则不增加fps,video,ffmpeg,Video,Ffmpeg,ffmpeg CLI允许您指定-r或-vf fps=为输出设置固定的fps 我希望得到的行为是: 输入可以具有任意FPS(可能为20-120) 如果输入FPS>30,则将其减少到30 FPS 如果输入FPS这可以在恒定帧速率视频上完成-我下面的方法可能适用于VFR视频,但我没有合适的视频进行测试 基本命令: ffmpeg -i 120.mp4 -vf "select='eq(n,0)+if(gt(t-prev_selected_t,1/30.01),1,0)'" -vsync 0 out.mp
-r
或-vf fps=
为输出设置固定的fps
我希望得到的行为是:
- 输入可以具有任意FPS(可能为20-120)
- 如果输入FPS>30,则将其减少到30 FPS
- 如果输入FPS这可以在恒定帧速率视频上完成-我下面的方法可能适用于VFR视频,但我没有合适的视频进行测试
基本命令:
在每秒120帧的流上ffmpeg -i 120.mp4 -vf "select='eq(n,0)+if(gt(t-prev_selected_t,1/30.01),1,0)'" -vsync 0 out.mp4
这就产生了Video: h264 (High) ... 120 fps, 120 tbr, 15360 tbn, 240 tbc
选择过滤器在选择第一帧后所做的工作是,如果它们与先前选择的帧的间隔为1/30秒或更长,则仅选择更多帧。实际上,这会将视频的帧速率降低到30帧以下 有两点需要注意: 1) 最后一帧的持续时间被截断,因此Video: h264 (High) ... 30.08 fps, 30 tbr, 15360 tbn, 240 tbc
值将略大于目标值。但所有其他帧的循环速度均为30 fps 2) 输出帧速率是源速率除以整数得到的最高数字。因此,如果在命令中,fps
替换为30.01
,结果将是26
,因为用120除以整数既不能得到25也不能得到26。这有助于避免输出中的运动停顿。命令中的除数应略大于上限,即24 tbr
而不是30.01
。否则,结果就会摇摆不定 如果输入为30 fps或更低,则选择所有帧30
附录: 如果上述命令的输出通过管道传输到另一个ffmpeg实例,则输出
是精确的,并且编解码器速率fps
也会重置tbc
ffmpeg -i 120.mp4 -vf "select='eq(n,0)+if(gt(t-prev_selected_t,1/30.01),1,0)'" -vsync 0 -c:v rawvideo -c:a pcm_s16le -f nut - | ffmpeg -f nut -i - out.mp4
如果我需要60fps的阈值,我可以使用“1/60”而不是“1/30.01”吗。那么,在这种情况下,它将要么是原始fps,要么是最高60 fps?当然,那很好。谢谢你的回复。我应该使用1/60还是1/60.01?60.01,因为浮点比较可能不精确。上述解决方案并没有解决我的问题。我在这里发布了一个新问题。