转自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。
图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标准。