使用FFMPEG API向MPEG-TS UDP流添加字幕的问题求助
MPEG-TS UDP推流添加字幕解决思路
前置兼容性说明
MPEG-TS 封装标准不支持直接封装 SRT/ASS 格式的软字幕轨道,绝大多数通用播放器无法识别直接嵌入的 SRT 流,所以必须先做格式适配,两种可选方向:
- 硬字幕方案:将字幕渲染到视频帧上再编码,兼容性100%,无播放器兼容问题
- 软字幕方案:将字幕转码为 TS 标准支持的
AV_CODEC_ID_DVB_SUBTITLE或AV_CODEC_ID_HDMV_PGS_SUBTITLE格式后,再封装为独立轨道
加载字幕文件添加到输出上下文方案修复步骤
- 先完成字幕解码:调用
avformat_open_input打开字幕文件,匹配对应字幕解码器,将原始字幕包解码为AVSubtitle结构,不要直接把 SRT 原始包送入输出上下文 - 初始化输出字幕流:创建输出编码器上下文指定编码为 DVB 字幕或 PGS 字幕,字幕流的 timebase 建议设置为和视频流一致,避免时间戳错位
- 时间戳重对齐:编码后的字幕包 pts/dts 必须转换为输出 TS 流的 timebase 对应值,调用
av_interleaved_write_frame写入输出上下文,保证音视频字幕流交错顺序正确
动态添加字幕方案修复步骤
- 直接构造
AVSubtitle结构体:设置好字幕的开始显示时间、结束显示时间、文本内容、显示坐标等参数 - 走标准字幕编码流程:和本地字幕文件方案一样,将构造好的
AVSubtitle编码为 DVB/PGS 格式的 AVPacket,对齐时间戳后写入输出上下文 - 若选择硬字幕方案更简单:引入
libass初始化渲染器,每次拿到解码后的原始 YUV 视频帧时,根据当前帧的 pts 匹配对应要显示的字幕,直接渲染到 YUV 帧对应位置,再送入视频编码器编码即可,不需要额外处理字幕轨道封装逻辑
排查验证步骤
先输出到本地 .ts 文件验证功能正常再推 UDP:
- 执行
ffprobe -show_streams 本地测试文件.ts检查输出流是否包含字幕轨道,编码格式是否符合预期 - 用 VLC/PotPlayer 打开本地文件确认字幕正常显示,排除封装逻辑问题后再切换为 UDP 推流,避免网络参数干扰排查
内容的提问来源于stack exchange,提问作者Zohan Le
相关产品推荐
相关产品推荐

