流复制.ts文件时能否移除Non-Monotonous DTS帧?
如何移除Non-Monotonous DTS帧并流复制TS视频文件
当然可以!针对你遇到的Non-Monotonous DTS帧问题,用FFmpeg就能轻松实现移除这类帧并流复制(不重新编码)TS视频文件的需求——这类低分辨率帧通常是视频中混入的异常帧或小尺寸预览帧,下面是具体的操作方案和细节说明:
一、核心思路:用FFmpeg精准筛选正常帧
FFmpeg的滤镜系统可以自动识别并跳过Non-Monotonous DTS这类时序异常的帧,同时修正输出流的PTS/DTS时序,确保播放流畅。因为你要保留原视频编码(AVC/H.264),流复制是最优选择,不会损失画质且速度极快。
二、直接可用的FFmpeg命令
这里有两条针对性的命令,任选其一即可:
命令1:通用异常帧筛选
ffmpeg -i input.ts -filter:v "select='concatdec_select',setpts=N/FRAME_RATE/TB" -c:v copy -c:a copy output.ts
命令2:针对DTS不递增的精准筛选
如果明确是DTS时序不递增导致的问题,用这条更精准:
ffmpeg -i input.ts -filter:v "select='gte(prev_dts,0) && dts>prev_dts',setpts=N/FRAME_RATE/TB" -c:v copy -c:a copy output.ts
命令参数解释:
-i input.ts:指定你的输入TS文件路径-filter:v:对视频轨道应用滤镜select='concatdec_select':FFmpeg内置的筛选逻辑,自动跳过包括Non-Monotonous DTS在内的各种解码异常帧select='gte(prev_dts,0) && dts>prev_dts':手动指定筛选规则,只保留DTS比前一帧大的正常帧setpts=N/FRAME_RATE/TB:重新计算输出帧的PTS(显示时间戳),确保时序连续,避免播放跳帧
-c:v copy -c:a copy:流复制视频和音频轨道,完全不重新编码,保留原画质和编码参数
三、关于VideoReDo失败的可能原因
VideoReDo虽然主打TS文件编辑,但它的自动修复逻辑可能对这类非标准的低分辨率异常帧识别不够敏感,你可以尝试开启它的「修复时序错误」「移除无效帧」这类高级选项再试,但相比之下,FFmpeg的命令行方式在自定义帧筛选上灵活性更强,更容易解决这类小众问题。
四、处理结果验证
用MediaInfo查看输出的TS文件,对比原文件的视频轨道信息:
Video ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L3.2
Format settings : CABAC / 2 Ref Frames
你会发现低分辨率的异常帧已经被移除,同时视频的编码参数完全保留(因为是流复制),播放时也不会再出现时序相关的问题。
内容的提问来源于stack exchange,提问作者MiGu3X




