ffmpeg CLI设置为-r 30(如果输入=> 30 fps,否则为-r以获取输入fps,如果<30 fps)

问题描述 投票:0回答:1

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

这是我所做的。从Youtube下载this video作为测试。使用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

谢谢!

ffmpeg frame frame-rate rate
1个回答
0
投票

示例视频的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)'"
© www.soinside.com 2019 - 2024. All rights reserved.