如何模拟MPEG-2传输流中相同PID音频ES流codec动态切换场景
问题原因分析
你之前的ffmpeg拼接方案失败的核心原因是:使用的concat滤镜工作在解码后帧级拼接的逻辑下,需要先将两个输入的音视频流完全解码为原始帧,拼接后再统一重编码输出,因此最终输出的音频流只能使用单一编码格式,无法实现中途切换codec的效果。
最优解决方案
推荐使用专门的MPEG-TS流处理工具直接在传输流层级拼接,不需要解码重编码,完全保留原有音视频编码参数,满足音频PID不变、仅中途变更编码类型的要求,首推开源工具TSduck,操作简单且完全符合你的使用场景。
操作步骤
- 预处理两个源TS文件:确保两个文件的视频PID(你当前环境为0x100)、音频PID(当前为0x101)、PAT/PMT PID完全一致,仅第二个文件的PMT表中音频ES的stream type字段与第一个不同(AAC为0x0F,MP2为0x03,你现有两个源文件已经符合该要求)
- 使用TSduck执行流拼接,命令如下:
tsp -b 188 \ -I file snippet_aac.ts \ -I file snippet_mp2.ts \ -P pmt --program 1 --set-stream-type 0x101:0x03 --after 120 \ -O file codec_switch.ts
参数说明:
--after 120表示在流播放120秒后(即第一个文件播放结束时)更新PMT表,将PID为0x101的音频流的编码类型修改为MP2(0x03),保证接收端能正确识别编码变更- 生成的
codec_switch.ts文件可以直接作为USB DVB调制器的输入,也可以通过ffmpeg直接推RTP流:
ffmpeg -re -i codec_switch.ts -c copy -f rtp rtp://目标地址:端口
其他可选方案
如果你需要模拟实时触发的编码切换场景,也可以采用动态切换推流输入的方案,不需要提前生成拼接文件:
启动推流服务先推送snippet_aac.ts,推流结束后立即无缝推送snippet_mp2.ts,可以借助ffmpeg的管道输入实现,流的短暂中断符合你的场景要求,不需要手动操作切换。
内容的提问来源于stack exchange,提问作者Tomás Álvarez
相关产品推荐
相关产品推荐

