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

如何将H264(AVCC)封装进TS流?C语言打包器问题求助

AVCC vs AnnexB在TS封装中的核心差异
  • NALU分隔逻辑不同:AnnexB用0x000001或0x00000001作为NALU分隔符,TS打包时可直接按分隔符拆分NALU后封装;AVCC无分隔符,每个NALU前是4字节大端长度字段,必须先读取长度值再截取对应字节的NALU数据,不能按固定分隔符处理。
  • SPS/PPS传递方式不同:AnnexB的SPS/PPS是带分隔符的独立NALU,直接嵌入码流;AVCC的SPS/PPS预存在专用数组中,需通过TS的PMT描述符或PES私有数据传递给解码器,无法从码流中直接解析出初始化信息。
  • PES初始化要求不同:AVCC对应的PES包必须在头部私有数据中写入AVCC格式的解码器配置块,而AnnexB无需此操作,解码器可直接从码流中提取SPS/PPS完成初始化。
你可能遗漏的关键步骤
  • 未正确处理AVCC的NALU长度字段:如果直接把4字节长度字段当成NALU数据打包,解码器会无法识别有效NALU,需跳过长度字段,只封装后续的NALU实际数据。
  • 未传递AVCC解码器配置信息:TS流的PMT视频ES条目下未添加Decoder Configuration Descriptor(携带SPS/PPS配置块)和Registration Descriptor(标识H.264),导致播放器无法初始化解码器。
  • PES时间戳设置错误:AVCC流通常携带时间戳信息,需确保PES包的PTS/DTS正确设置,尤其是IDR帧的PTS必须准确,否则播放器无法同步播放。
  • TS包连续性计数器异常:AVCC流打包时未正确递增continuity_counter,导致播放器丢弃异常包,无法拼接出完整码流。
AVCC封装TS需要的额外操作
  • 预提取并组织AVCC配置块:从AVCC流起始部分提取SPS、PPS,按格式组装成配置块:0x17(H264标识+profile) + 兼容位 + level + 保留位 + SPS数量 + 2字节SPS长度 + SPS数据 + PPS数量 + 2字节PPS长度 + PPS数据。
  • 在PMT中添加专用描述符:在PMT的视频ES条目下,添加Registration Descriptor(tag=0x05,数据为0x48 0x2D 0x32 0x36 0x34,即"H.264")和Decoder Configuration Descriptor(tag=0x06,数据为上述配置块)。
  • 强制在首个PES包携带配置块:即使PMT已配置描述符,仍需在第一个视频PES包的PES_private_data字段写入配置块,确保播放器快速获取初始化信息。
  • 校验长度字段字节数:部分非标准AVCC流可能用3字节长度字段,需提前确认源流的长度字段规格,避免截取NALU时出错。

内容的提问来源于stack exchange,提问作者Iceman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:34:55