H.264码流结构解析1

时间:2022-10-31 18:37:52
转自http://m.blog.csdn.net/article/details?id=51174680
码流分析工具ESEyE

1. H.264简介

MPEG(Moving Picture Experts Group)和VCEG(Video Coding Experts Group)已

经联合开发了一个比早期研发的MPEG 和H.263性能更好的视频压缩编码标准,这就是

被命名为AVC(Advanced Video Coding),也被称为ITU-T H.264建议和MPEG-4的第1

0 部分的标准,简称为H.264/AVC或H.264。这个国际标准已经与2003年3月正式被ITU-T

所通过并在国际上正式颁布。为适应高清视频压缩的需求,2004年又增加了FRExt部分

;为适应不同码率及质量的需求,2006年又增加了可伸缩编码 SVC

2. H.264编码格式

H.263定义的码流结构是分级结构,共四层。自上而下分别为:图像层(picturelayer)、块

组层(GOB layer)、宏块层(macroblock layer)和块层(block layer)。而与H.263相比,H.2

64的码流结构和H.263的有很大的区别,它采用的不再是严格的分级结构。

H.264支持4:2:0的连续或隔行视频的编码和解码(使用YUV4:2:0颜色模式,进行逐行,

或者隔行模式进行编码,也就是压缩。关于YUV4:2:0颜色模式参考http://blog.csdn.net/
 

qingkongyeyue/article/details/52170315


)。H.264压缩与H.263、MPEG-4相比,

视频压缩比提高了一倍。

在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:

视频编码层(VCL,Video Coding Layer)和网络抽象层(NAL,Network Abstraction L

ayer)。其

中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保

证数据适合各种信道和存储介质上的传输。NAL单元是NAL的基本语法结构,它包含

个字节的头信息一系列来自VCL的称为原始字节序列载荷(RBSP)的字节

 
这里的一个字节的头信息

NAL Header:
forbidden_bit(1bit): 禁止位,初始为0,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。
nal_reference_bit(优先级)2bit:nal重要性指示,标志该NAL单元的重要性,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU(NALU的结构是:NAL头+RBSP)
nal_unit_type(类型)5bit:
标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。



SODB RBSP EBSP的区别


SODB 数据比特串-->最原始的编码数据

RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 

一个bit“1”)若干比特“0”,以便字节对齐

EBSP 扩展字节序列载荷-->在RBSP基础上填加了仿校验字节(0X03)它的原因是:

 在NALU加到Annexb上时,需要填加每组NALU之前的开始码StartCodePrefix,如果该N

ALU对应的slice(一帧由多个slice(也就是NALU为一帧的开始则用4位字节表示,ox0


0000001,否则用3位字节表示ox000001.为了使NALU主体中不包括与开始码相冲突的,

在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。也

称为脱壳操作。
 
3. H.264码流结构图
字节流格式AnnexB格式:NALU(Network Abstract Layer Unit)数据+开始前缀(00000001或000001)
如果NALU对应的Slice(片)为一帧的开始,则用4字节表示,即0x00000001;否则用3字节表示,0x000001。
H.264码流结构解析1 
图3 H.264码流分层结构
 

4. H.264解码

NAL头信息的
nal_referrence_idc(NRI)用于在重建过程中标记一个NAL单元的重要性

值为0表示这个NAL单元没有用预测,因此可以被解码器抛弃而不会有错误扩散;值高于

0表示NAL单元要用于无漂移重构,且值越高,对此NAL单元丢失的影响越大。 


NAL头信息的隐藏比特位,在H.264编码器中默认为0,当网络识别到单元中存在比特错

误时,可将其置为1。隐藏比特位主要用于适应不同种类的网络环境(比如有线无线相结

合的环境)。

 

图4 NAL单元解码

NAL单元解码的流程为:首先从NAL单元中提取出RBSP语法结构,然后按照如图4所示

的流程处理RBSP语法结构。输入的是NAL单元,输出结果是经过解码的当前图像的样

值点。 


NAL单元中分别包含了序列参数集和图像参数集。图像参数集和序列参数集在其他NAL

单元传输过程中作为参考使用,在这些数据NAL单元的片头中,通过语法元素

设置它们所使用的图像参数集编号;而相应的每个图像参数集中,通过语法元素seq_pa

ramter_set_id设置他们使用的序列参数集编号。

6. 各分层结构的语法元素参考G50标准。