简介
NALU是H264码流的基本单元。它的起始码是0x000001或0x00000001,可以根据起始码查找NALU元素。如下图所示,
H264中NALU由header和body两部分构成。
NALU header
- forbidden_zero_bit,必须为0
- nal_ref_idc, 如果nalu_type为slice,表示该slice是否用作参考
- nal_unit_type,表示nalu类型
NALU类型定义如下,一般比较常见的几种类型是非IDR slice(type=1)、IDR(type=5)、SPS(type=7)、PPS(type=8)
NALU body
Nalu body生成流程如下:
- 视频编码生成的比特流称为SODB(String of Data Bits)。由于SODB可能不是整数字节,因此需要在后面填充数据使其变成整数字节,填充后的比特流称为RBSP(Raw Byte Sequence Payload)。
SODB生成RBSP过程如下:
- RBSP第1字节取SODB最左端8比特,第2字节取接下来8比特,以此类推直到SODB剩余内容不足8比特。
- RBSP下一字节首先包含SODB最后几个比特,然后添加比特1,如果该字节还不满8比特后面填充0。
- 后面可能加入若干16比特的cabac_zero_word作为填充比特,其值为0x00 00。
- RBSP还不能直接作为NALU Body,因为RBSP中可能含有0x00 00 01,与起始码冲突,必须先进行冲突避免处理。规则如下:遇到0x000000、0x000001、0x000002、0x000003在两个00字节后插入一个字节0x03.
0x000000 -> 0x00000300
0x000001 -> 0x00000301
0x000002 -> 0x00000302
0x000003 -> 0x00000303