You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg中-vsync passthrough导致DTS非单调告警的处理疑问

问题解答

关于vsync选项的选择

  • 不需要强制用-vsync passthrough来保证帧显示顺序。默认的-vsync auto(或-1)会根据输出容器的特性自动调整同步策略,已经能确保帧按正确顺序显示,同时避免时间戳冲突问题。
  • 只有当你需要严格保留输入视频的所有原始时间戳,不允许FFmpeg做任何调整时,才需要用passthrough模式,这种场景非常少见,比如做原始视频数据归档之类的需求。

若必须使用-vsync passthrough的告警解决方法

出现告警的原因是threshold滤镜会生成新的输出帧,而passthrough模式强制传递输入时间戳,导致输出帧出现重复的DTS,不符合MP4容器对DTS必须单调递增的要求。可以用以下两种方法解决:

方法1:在滤镜链中添加时间戳修正

修改滤镜复杂链,在threshold后加上setpts=N/(FRAME_RATE*TB)来生成严格递增的时间戳,命令示例:

# input.mp4 has resolution 790x790
ffmpeg -vsync passthrough -i input.mp4 -f lavfi -i color=808080:s=790x790 -f lavfi -i color=black:s=790x790 -f lavfi -i color=white:s=790x790 -filter_complex '[0:v][1:v][2:v][3:v]threshold,setpts=N/(FRAME_RATE*TB)' -an -c:v h264_nvenc threshold.mp4

方法2:添加容器时间戳修正参数

在命令末尾加上-avoid_negative_ts make_non_negative,让FFmpeg自动修正不合法的时间戳,同时保留passthrough的核心逻辑:

# input.mp4 has resolution 790x790
ffmpeg -vsync passthrough -i input.mp4 -f lavfi -i color=808080:s=790x790 -f lavfi -i color=black:s=790x790 -f lavfi -i color=white:s=790x790 -filter_complex '[0:v][1:v][2:v][3:v]threshold' -an -c:v h264_nvenc -avoid_negative_ts make_non_negative threshold.mp4

关于-fps_mode失效的问题

你使用的FFmpeg master分支版本中,-fps_mode是较新的参数,它和-vsync passthrough的组合存在兼容性问题,且该参数主要用于更精细的帧率控制场景,不如传统的-vsync参数稳定。建议继续使用-vsync系列参数满足需求。

内容的提问来源于stack exchange,提问作者antortjim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:35:26