gpt4 book ai didi

video - ffmpeg:如果超过阈值则降低 fps,但如果低于阈值则不增加

转载 作者:行者123 更新时间:2023-12-04 22:55:47 25 4
gpt4 key购买 nike

ffmpeg CLI 允许您指定 -r <fps>-vf fps=<fps>为您的输出设置固定的 FPS。

我想得到的行为是:

  • 输入可以有任意 FPS(可能是 20-120)。
  • 如果输入 FPS >30,则将其降低到 30 FPS。
  • 如果输入 FPS <=30,则不要修改 FPS。

  • 更多背景:

    上述选项非常适合将视频标准化为固定的 FPS,但不能很好地确保视频不会有效地超过某个 FPS 阈值。确实,如果我设置 -r 30并且视频是 29 fps,ffmpeg 会占用我们很多 CPU 来将其提升到 30当我的用例不需要它时。

    最佳答案

    这可以在恒定帧率视频上完成 - 我下面的方法可能适用于 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 fps 流上,
    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 fps 以下。

    有两点需要注意:

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

    2) 输出帧率是源速率除以整数得到的最高数。所以,如果在命令中, 30.01替换为 26 ,结果将是 24 tbr因为 25 和 26 都不能通过将 120 除以整数得到。这有利于避免输出中的运动卡顿。命令中的除数应略大于上限,即 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

    关于video - ffmpeg:如果超过阈值则降低 fps,但如果低于阈值则不增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43334291/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com