如何将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
相关产品推荐
相关产品推荐

