H264 NALU说明

在H.264/AVC视频编码标准中,编码的数据流(位流)由两个层面组成:
视频编码层面(VCL)网络抽象层面(NAL)

H264编码产生的结果(位流)首先为视频编码层(VCL),为了便于网络传输与存储,需要将编码层的VCL数据再打包成NAL(全称Network Abstract Layer),即网络抽象层。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。

做流媒体研发的工作只需要关心NAL层,不一定需要掌握VCL层数据。

一个NAL的单元称为NALU,WEBRTC的RTP发送的是NALU数据。

NAL单元是NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷(RBSP)的字节流。

H264一帧压缩数据有几个NALU

一个视频帧输出的结果可以打包成一个NALU,也可能有多个NALU,含有多个NALU叫多个slice(multiple slices)。Slice(分片),h264编码可以将一幅图片分割成若干个Slice,Slice承载固定数目的宏块。将一幅图片分割成若干Slice的目的是,为限制误码的扩散和传输。如果H264的一个帧被分片编码,则每个slice最后将产生一个NALU。

如果NALU对应的Slice为一帧的开始,则用4字节表示,即0x00000001,代表一个帧头的起始码前缀;否则用3字节表示,0x000001,就是一个完整的帧被编为多个slice的时候,第二个slice及以后的Slice的nalu使用3字节起始码。

NALU结构

NALU有一个NALU头字段,长度为一个字节,结构如下:

NAL Header:

forbidden_bit: 1 bit
nal_reference_bit(优先级):2bit,
nal_unit_type(类型):5bit。

NALU头部各字段的含义解释

nal_unit_type:
 
标识NAL单元中的RBSP数据类型,其中,
nal_unit_type为1, 2, 3, 4, 5的NAL单元称为VCL的NAL单元
其他类型的NAL单元为非VCL的NAL单元

nal_unit_type 的各种值的含义如下:

0:未定义
1:非IDR图像中不采用数据划分的片段
2:非IDR图像中A类数据划分片段
3:非IDR图像中B类数据划分片段
4:非IDR图像中C类数据划分片段
5:IDR图像的片段
6:补充增强信息(SEI)
7:序列参数集(SPS)
8:图像参数集(PPS)
9:分割符
10:序列结束符
11:流结束符
12:填充数据
13:序列参数集扩展
14:带前缀的NAL单元
15:子序列参数集
16 – 18:保留
19:不采用数据划分的辅助编码图像片段
20:编码片段扩展
21 – 23:保留
24 – 31:未规定

nal_reference_bit:

用于表示该NAL是否可以丢弃(有无被其后的NAL参考),
00b表示没有参考作用,可丢弃,如B slice、SEI等,
非零——包括01b、10b、11b——表示该NAL不可丢弃,如SPS、PPS、I Slice、P Slice等。

forbidden_bit: 

在 H.264 规范中规定了这一位必须为 0.禁止位,0表示正常,1表示错误,一般都是0;

 
常用的NAL头的取值:

0x67: SPS 
0x68: PPS 
0x65: IDR   
0x61: non-IDR Slice
0x01: B Slice
0x06: SEI
0x09: AU Delimiter

你可能感兴趣的:(流媒体应用,视频直播技术,移动直播技术,H264,NAL详解,NALU详解,NAL含义)