Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video ffmpeg:如果超过阈值,则减少fps;如果低于阈值,则不增加fps_Video_Ffmpeg - Fatal编程技术网

Video ffmpeg:如果超过阈值,则减少fps;如果低于阈值,则不增加fps

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

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.mp4
    
    在每秒120帧的流上

    Video: h264 (High) ... 120 fps, 120 tbr, 15360 tbn, 240 tbc
    
    这就产生了

    Video: h264 (High) ... 30.08 fps, 30 tbr, 15360 tbn, 240 tbc
    
    选择过滤器在选择第一帧后所做的工作是,如果它们与先前选择的帧的间隔为1/30秒或更长,则仅选择更多帧。实际上,这会将视频的帧速率降低到30帧以下

    有两点需要注意:

    1) 最后一帧的持续时间被截断,因此
    fps
    值将略大于目标值。但所有其他帧的循环速度均为30 fps

    2) 输出帧速率是源速率除以整数得到的最高数字。因此,如果在命令中,
    30.01
    替换为
    26
    ,结果将是
    24 tbr
    ,因为用120除以整数既不能得到25也不能得到26。这有助于避免输出中的运动停顿。命令中的除数应略大于上限,即
    30.01
    而不是
    30
    。否则,结果就会摇摆不定

    如果输入为30 fps或更低,则选择所有帧


    附录

    如果上述命令的输出通过管道传输到另一个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,因为浮点比较可能不精确。上述解决方案并没有解决我的问题。我在这里发布了一个新问题。