ffmpeg - ffmpeg CLI 设置 -r 30 如果输入 => 30 fps,否则 -r 如果 < 30 fps 则采用输入 fps
问题描述
我在这里发布了我原来的问题。尝试了建议的解决方案。但这并不能解决我的问题。
这就是我所做的。从 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)'"
推荐阅读
- dart - Flutter:图像缩放问题
- jquery - 选择div内的输入隐藏值
- python-3.x - 是否可以放松 MILP 并获得与原始 MILP 相同的解决方案?
- php - 使用 Symfony4 阅读注释
- reactjs - 以编程方式将用户发送到 react-redux 应用程序中的登录页面
- python - 异步套接字,本地主机与本地 IP
- java - 在 Dagger 中读取环境变量
- c# - c#.net core 2 web api:缺少父对象和/或验证的正确HTTP结果?
- ios - 为什么 SpriteKit 的 'addChild' 方法会导致混乱
- c# - 如何在 C# 中将光标导航到我的二维数组中?