RTP --- H.264 NALU 介绍
NALU
H264 原始码流是由一个接一个 NALU(NAL Unit) 组成,每个NALU之间都使用start code(起始码)分隔,NALU单元通常由[StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是00 00 00 01 或00 00 01。每个 NALU包括一个头部信息(NAL header,一字节)和一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload)。
NAL header
forbidden_zero_bit (F,占1bit)
在 H.264 规范中规定了这⼀位必须为 0 。
nal_ref_idc (NRI,占2bit)
NAL重要性,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU,而不影响图像的回放 。 如果当前NALU是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。
nal_unit_type(Type,占5bit):
这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用。
常见的NALU类型
NAL header | 类型 | 重要性 | nal_unit_type |
0x67 (0 11 00111) | SPS | 非常重要 | type = 7 |
0x68 (0 11 01000) | PPS | 非常重要 | type = 8 |
0x65 (0 11 00101) | IDR帧 | 关键帧 非常重要 | type = 5 |
0x61 (0 11 00001) | I帧 | 非常重要 | type=1非IDR的I帧不大常见 |
0x41 (0 10 00001) | P帧 | 重要 | type = 1 |
0x01 (0 00 00001) | B帧 | 不重要 | type = 1 |
0x06 (0 00 00110) | SEI | 不重要 | type = 6 |
帧类型
I帧:完整编码的帧叫I帧,是一个图像经过压缩后的产物,自身可以通过视频解压算法解压成一张单独的完整的图片
IDF帧:序列的首个帧,IDF帧属于I帧。发送IDR帧前会先发送 SPS NALU、PPS NALU
P帧:参考之前的I帧生成的只包含差异部分编码的帧叫P帧, 需要参考其前面的一个I 帧或者P 帧来生成一张完整的图片 ;
B帧:参考前后的帧编码的帧叫B帧 , 要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片 。