H.264的两种打包/封装方法:字节流AnnexB格式 AVCC格式
放用于网络发送时,要封装成RTP格式
1、AnnexB格式----用于实时播放
处于H264文档附录B(Annex-B Byte stream format)中
开始前缀(00000001或000001)+NALU数据 绝大部分编码器的默认输出格式
一共有两种起始码start_code
①3字节0x000001 单帧多slice(即单帧多个NALU)之间间隔
②4字节0x00000001 帧之间,或者SPS等之前
4字节类型的开始码在在连续的数据传输中非常有用,因为用字节来对齐、分割流数据,比如:用连续的31个bit0后接一个bit1来分割流数据,是很容易的。
AnnexB格式每个NALU都包含起始码,且通常会周期性的在关键帧之前重复SPS和PPS
👉👉👉所以解码器可以从视频流随机点开始进行解码,实时的流格式
2、AVCC—用于存储
解码器配置参数在一开始就配置好了,系统可以很容易的识别NALU的边界,不需要额外的起始码,减少了资源的浪费,同时可以在播放时调到视频的中间位置。这种格式通常被用于可以被随机访问的多媒体数据,如存储在硬盘的文件。MP4、MKV通常用AVCC格式来存储。
AVCC格式不使用起始码作为NALU的分界,这种格式在每个NALU前都加上一个大端格式的前缀(1、2、4字节,代表NALU长度)
所以在解析AVCC格式的时候需要将指定的前缀字节数的值保存在一个头部对象中,这个都通常称为extradata或者sequence header。同时,SPS和PPS数据也需要保存在extradata或者叫’sequence header’中。
H.264 extradata / sequence header’语法如下:
bits
8 version ( always 0x01 )
8 avc profile ( sps[0][1] )
8 avc compatibility ( sps[0][2] )
8 avc level ( sps[0][3] )
6 reserved ( all bits on )
2 NALULengthSizeMinusOne 变量告诉我们用几个字节来存储NALU的长度(前缀:1、2或4)
// 【第5字节的后2位】这个值是(前缀长度-1),如果值=3,那前缀就是4,因为4-1=3
值=0 对应前缀1字节 对应每个NALU包最大长度255字节
值=