ffmpeg CLI 设置 -r 30 如果输入 => 30 fps,否则 -r 如果 < 30 fps 则采用输入 fps

标签 ffmpeg frame frame-rate rate

我发布了我的 original question here .试过suggested solution .但这并不能解决我的问题。

这就是我所做的。下载 this video来自 Youtube 作为测试。使用 ffprobe 给出:

Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 59.94 fps, 59.94 tbr, 1k tbn, 119.88 tbc (default)

我使用的 ffmpeg 命令:
ffmpeg -i Iron_Man_1080p_60fps.mp4 -vf "select='eq(n,0)+if(gt(t-prev_selected_t,1/30.01),1,0)'" -vsync 0 -c:v libx265 -crf 28 -c:a aac -b:a 64k Iron_Man_1080p_60fps_CONVERTED.mp4

ffprobe 我的输出文件 Iron_Man_1080p_60fps_CONVERTED.mp4 :
Stream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 454 kb/s, 20.49 fps, 59.94 tbr, 19001 tbn, 59.94 tbc (default)

如您所见,fps 从 59.94 fps 下降到 20.49 fps。

我不确定为什么建议的解决方案不起作用。
ffmpeg -i 120.mp4 -vf "select='eq(n,0)+if(gt(t-prev_selected_t,1/30.01),1,0)'" -vsync 0 out.mp4

也许 -vf 没有设置固定的帧速率?

有人可以使用 -r 标志提供替代解决方案吗?

这里重新陈述一个问题:
  • 如果输入 fps => 30 fps
  • 则设置 -r 30
  • 如果输入 fps < 30 fps
  • 则设置 -r input_fps

    谢谢!

    最佳答案

    示例视频的 time_base 是粗略的,因此视频实际上是 VFR。将间隔更改为 1/30.5保留刚刚超出 1/30.01 阈值的帧

    -vf "select='eq(n,0)+if(gt(t-prev_selected_t,1/30.50),1,0)'"
    

    关于ffmpeg CLI 设置 -r 30 如果输入 => 30 fps,否则 -r 如果 < 30 fps 则采用输入 fps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59297824/

    相关文章:

    c# - 如何切换到显示为弹出窗口的框架

    Java 图形用户界面和构造函数

    python - 为什么 ffmpeg-python 会在这里抛出编解码器错误?

    bash - 正在寻找用 gnuplot 和 ffmpeg 做一个小动画

    android - 是否有任何音频播放库可以与 getCurrentPostition() 和 seekTo() 一起正常工作?

    python - 有关将图像添加到视频的信息

    wpf - 如何点击页面的一个按钮来改变Windows的框架来源?

    python - 如何提高 'framerate'或文本打印速度? (文字冒险游戏)

    vb6 - 帮助 ffmpeg

    c++ - 直接显示 : How to change Size and frame rate of video?