H.264 基本流的结构

H.264 的基本流(elementary stream,ES)的结构分为两层,包括视频编码层(VCL)网络适配层(NAL)。视频编码层负责高效的视频内容表示,而网络适配层负责以网络所要求的恰当的方式对数据进行打包和传送。

引入NAL并使之与VCL分离带来的好处包括两方面:
其一、使信号处理和网络传输分离,VCL 和NAL 可以在不同的处理平台上实现;
其二、VCL 和NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。


H.264 的基本流由一系列NALU (Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同。
H.264 草案指出[2],当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001,用来指示一个 NALU的起始和终止位置。在这样的机制下,在码流中检测起始码,作为一个NALU得起始标识,当检测到下一个起始码时,当前NALU结束。每个 NALU单元由一个字节的 NALU头(NALU Header)和若干个字节的载荷数据(RBSP)组成。其中NALU 头的格式如图2 所示:

F:forbidden_zero_bit.1 位,如果有语法冲突,则为 1。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元。 
NRI:nal_ref_idc.2 位,用来指示该NALU 的重要性等级。值越大,表示当前NALU越重要。具体大于0 时取何值,没有具体规定。

Type:5 位,指出NALU 的类型。

需要特别指出的是,NRI 值为 7 和 8 的NALU 分别为序列参数集(sps)和图像参数集(pps)。参数集是一组很少改变的,为大量VCL NALU 提供解码信息的数据。其中序列参数集作用于一系列连续的编码图像,而图像参数集作用于编码视频序列中一个或多个独立的图像。如果没能正确接收到这两个参数集,那么其他NALU 也是无法解码的。

从视频编码层出来的数据为一系列的编码数据比特串,我们称为SODB,即最原始的编码数据。
在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐,叫做RBSP原始字节序列载荷。

EBSP扩展字节序列载荷-- >在RBSP基础上填加了仿校验字节(0X03)它的原因是:在NALU加到Annexb(一种格式)上时,需要填加每组NALU之前的开始码 StartCodePrefix如果该NALU对应的slice(片)为一帧的开始则用4位字节表示,0x00000001否则用3位字节表示 0x000001为了使NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。也称为脱壳操作。

VCL数据即被压缩编码后的视频数据序列。在VCL数据要封装到NAL单元中之后,才可以用来传输或存储。NAL单元格式如下图:

猜你喜欢

转载自blog.csdn.net/cindywry/article/details/107493223