使用select滤镜限制FPS后HLS输出帧率元数据异常及优化方案咨询
解决方案
修复现有select滤镜命令的问题
你的问题核心是select滤镜仅筛选帧,但未修正输出流的时间戳和帧率元数据,导致ffmpeg仍沿用原视频120fps的参数计算HLS分段。只需在滤镜链中添加setpts调整时间戳,并通过-r指定输出帧率,即可让ffmpeg识别正确的帧率:
ffmpeg -i input.mp4 -vf "select='eq(n,0)+if(gt(t-prev_selected_t,1/30.50),1,0)',setpts=N/30/TB" -r 30 -c:v libx264 -f hls output.m3u8
setpts=N/30/TB:将选中帧的时间戳重新映射到30fps的时间轴,确保帧间隔均匀匹配目标帧率-r 30:明确告知ffmpeg输出流的帧率为30,HLS分段会以此为基准计算片段时长和帧数,同时修正.ts文件的元数据帧率
更简洁的帧率限制方法(无需额外命令)
如果不需要自定义帧选择逻辑,直接使用fps滤镜是更可靠的方案——它会自动处理帧筛选、时间戳修正和帧率元数据设置,无需额外工具:
ffmpeg -i input.mp4 -vf fps=30 -c:v libx264 -f hls output.m3u8
若需要和原命令类似的精确帧间隔(比如以30.50为目标帧率),直接调整参数即可:
ffmpeg -i input.mp4 -vf fps=30.50 -c:v libx264 -f hls output.m3u8
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

