MPEG-TS时间戳无效问题——Nexio服务器报错求助
问题背景
帮电视台同事处理4声道MPEG-TS文件,需将SAP音频复制生成8声道文件:把原声道3-4移至新文件的7-8声道,同时将新文件的3-6声道设为静音。当前分两步处理后,生成的文件被Nexio服务器以时间戳无效为由拒绝,尝试copyts、genpts、gendts参数无效;不重编码音频时源文件可正常使用,同时重编码音视频也能工作,但绝对不能重编码视频。
当前操作步骤
- 复制声道1-4到5-8生成中间文件:
ffmpeg -i input.ts -map 0:v -c:v copy -map 0:a -c:a copy -map 0:a -c:a copy firstpass.ts - 对中间文件的3-6声道静音:
ffmpeg -i firstpass.ts -map 0:v -c:v copy -map 0:a -filter:a:1 "volume=0" -filter:a:2 "volume=0" -c:a aac -b:a 128k output.ts
报错信息
FFmpeg报错
[mpegts @ 0x7fcadd204200] Invalid timestamps stream=0, pts=10714614, dts=10720620, size=3646
Nexio服务器报错
[12:00:13] [33352 M] [XXXXX DISCONTINUITY: currentVideoFrameInfo.start = 631109472, expectedVideoFrameStart = 624238608]
[12:00:13] [33352 M] [XXXXX SMALL DISCONTINUITY. NOT CORRECTING TIME BASE HERE]
[12:00:13] [33352 M] [Error: PTL Error: discontinuous time stamp is detected. Actual lxf packet start = 630053424 (frame number = 26226). Expected lxf packet start = 623182560 (frame number = 25940)]
[12:00:13] [33352 M] [Error: PTL Error: processing is aborted (AbortImportIfMissingPacket = 1)]
解决办法
核心思路
避免分两次处理引入时间戳偏移,直接一步完成声道映射与静音操作;同时添加参数强制时间戳对齐、消除不连续性,确保视频流全程不重编码。
直接处理命令
ffmpeg -i input.ts -map 0:v -c:v copy \ # 保留原声道1作为新文件声道1 -map 0:a:0 -c:a copy \ # 保留原声道2作为新文件声道2 -map 0:a:1 -c:a copy \ # 新文件声道3-6设为静音(基于原音频流生成静音轨) -map 0:a:0 -filter:a "volume=0" -c:a aac -b:a 128k \ -map 0:a:0 -filter:a "volume=0" -c:a aac -b:a 128k \ -map 0:a:0 -filter:a "volume=0" -c:a aac -b:a 128k \ -map 0:a:0 -filter:a "volume=0" -c:a aac -b:a 128k \ # 原声道3-4移至新文件声道7-8 -map 0:a:2 -c:a copy \ -map 0:a:3 -c:a copy \ # 强制时间戳从0开始,消除偏移 -avoid_negative_ts make_zero \ # 生成正确的PTS时间戳 -fflags +genpts \ # 强制音视频包严格按时间戳交织,避免不连续 -max_interleave_delta 0 output.ts
备选修复步骤
如果直接处理仍有问题,先修复源文件时间戳再处理:
- 修复源文件时间戳:
ffmpeg -i input.ts -c copy -fflags +genpts -avoid_negative_ts make_zero fixed_input.ts - 使用修复后的文件执行上述直接处理命令,将
input.ts替换为fixed_input.ts即可。
内容的提问来源于stack exchange,提问作者Cody Greene

