H264是一种视频编码格式,并且可以作为网络视频编解码格式,因为它具备以下特点:
它的基本流采用分层结构->包括视频编码层(VCL)和网络适配层(NAL)
视频编码层负责高效的视频内容表示,而网络适配层负责以网络所要求的恰当的方式对数据进行打包和传送。
引入NAL并使之与VCL分离带来的好处包括两方面:
其一、使信号处理和网络传输分离,VCL 和NAL 可以在不同的处理平台上实现;
其二、VCL 和NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码
H264的基本流由一系列NALU (Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同。H.264 草案指出当数据流是储存在介质上时,在每个NALU 前添加起始码:0x00 00 0001,用来指示一个 NALU的起始和终止位置。在这样的机制下,解码器在码流中检测起始码,作为一个NALU得起始标识,当检测到下一个起始码时,当前NALU结束。每个NALU单元由一个字节的 NALU头(NALU Header)和若干个字节的载荷数据(RBSP)组成。
其中NALU 头的格式:
==========================表一===========================
BIT 0 1 2 3 4 5 6 7
F| NAI | TYPE
=========================================================
F:forbidden_zero_bit.1 位,如果有语法冲突,则为 1。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元。
NRI:nal_ref_idc.2 位,用来指示该NALU 的重要性等级。值越大,表示当前NALU越重要。具体大于0 时取何值,没有具体规定。
Type:5 位,指出NALU 的类型。具体如下所示:
===========================表二=================================
NAL_UNIT_TYPE NALU内容
0 未指定
1 非IDR图像的编码slice
2 编码slice数据划分A
3 编码slice数据划分B
4 编码slice数据划分C
5 IDR图像中的编码slice
6 SEI(补充增强信息)
7 SPS(序列参数集)
8 PPS(图像参数集)
9 接入单元定界符
10 序列结束
11 码流结束
12 填充数据
13-23 保留
24 STAP-A
25 STAP-B
26 MTAP16
27 MTAP24
28 FU-A
29 FU-B
30-31 undefined
==================================================================
需要特别指出的是,NRI 值为 7 和 8 的NALU 分别为序列参数集(sps)和图像参数集(pps)。
参数集是一组很少改变的,为大量VCL NALU 提供解码信息的数据。其中序列参数集作用于一系列连续的编码图像,
而图像参数集作用于编码视频序列中一个或多个独立的图像。
如果解码器没能正确接收到这两个参数集,那么其他NALU 也是无法解码的。
因此它们一般在发送其它 NALU 之前发送,并且使用不同的信道或者更加可靠的传输协议(如TCP)进行传输,也可以重复传输。