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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:09:03