from:http://wenku.baidu.com/link?url=hYQHJcAWUIS-8C7nSBbf-8lGagYGXKb5msVwQKWyXFAcPLU5gR4BKOVLrFOw4bX5nWwGxQ9d1-kj0JYvAZA5-wz7KmW4tYeF_qmS1FNyV2e
H.264码流结构解析
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的第10 部分的标准,简称为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.264的码流结构和H.263的有很大的区别,它采用的不再是严格的分级结构。
H.264支持4:2:0的连续或隔行视频的编码和解码。H.264压缩与H.263、MPEG-4相比,视频压缩比提高了一倍。
H.264的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer)。VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元中。每个NAL单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL头信息。RBSP的基本结构是:在原始编码数据的后面填加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
NAL头
„„
RBSP
NAL头
RBSP
NAL头
RBSP
„„
图1 NAL单元序列
3. H.264传输
H.264的编码视频序列包括一系列的NAL单元,每个NAL单元包含一个RBSP,见表1。编码片(包括数据分割片IDR片)和序列RBSP结束符被定义为VCL NAL单元,其余为NAL单元。典型的RBSP单元序列如图2所示。每个单元都按独立的NAL单元传送。单元的信息头(一个字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。
SPS
P片
SEI
PPS
I片
图像定界符
P片
图2 RBSP序列举例
RBSP类型 描述
参数集PS 序列的全局,如图像尺寸、视频格式等
增强信息SEI 视频序列解码的增强信息
图像定界符PD
视频图像的边界 编码片 片的头信息和数据
数据分割
DP片层的数据,用于错误恢复解码
序列结束符 表明下一图像为IDR图像 流结束符 表明该流中已没有图像 填充数据
哑元数据,用于填充字节 表1 RBSP描述
4. H.264码流结构图
起始码Nal Unit„„RTP Packet„„
层二:NAL Unit
层一:
A. Annexb格式
B. RTP格式
NALU Header
NALU 主体
层三:Slice
Slice Header
Slice Data
层四:Slice Data
flags
Macroblock Layer Macroblock Layer „„
层五:PCM类
mb_type
PCM Data
mb_type
Sub_mb_pred或mb_pred
Residual Data
其他宏块类型
层六:Residual
Residual Block
图3 H.264码流分层结构
起始码:如果NALU对应的Slice为一帧的开始,则用4字节表示,即0x00000001;否则用3字节表示,0x000001。
NAL Header:forbidden_bit,nal_reference_bit(优先级),nal_unit_type(类型)。
脱壳操作:为了使NALU主体不包括起始码,在编码时每遇到两个字节(连续)的0,就插入一字节0x03,以和起始码相区别。解码时,则将相应的0x03删除掉。
NALU类型:
Nal_unit_type
NAL类型 C 0 未使用
1 不分区、非IDR图像的片
2,3,4 2 片分区A 2 3 片分区B 3 4 片分区C 4 5 IDR图像中的片 2,3 6
补充增强信息单元(SEI)
5
7 序列参数集 0 8 图像参数集 1 9 分界符 6 10 序列结束 7 11 码流结束 8 12 填充 9 13~23 保留 24~31
未使用
表2 nal_unit_type语义
sub_mb_pred和mb_pred:运动补偿或者是帧内预测。
5. H.264解码
NAL头信息的nal_referrence_idc(NRI)用于在重建过程中标记一个NAL单元的重要性,值为0表示这个NAL单元没有用预测,因此可以被解码器抛弃而不会有错误扩散;值高于0表示NAL单元要用于无漂移重构,且值越高,对此NAL单元丢失的影响越大。
NAL头信息的隐藏比特位,在H.264编码器中默认为0,当网络识别到单元中存在比特错误时,可将其置为1。隐藏比特位主要用于适应不同种类的网络环境(比如有线无线相结合的环境)。
从码流中获取NALU
将NALU中的数据转换成RBSP
NALU类型
进入片解码过程
SLICE=1
IDR=5
进入SEI解码过程进入SPS解码过程进入PPS解码过程
出错处理
进入A片分割解码过程进入B片分割解码过程进入C片分割解码过程SEI=6SPS=7PPS=7Else
DPA=2
DPA=3DPA=4图4 NAL单元解码
NAL单元解码的流程为:首先从NAL单元中提取出RBSP语法结构,然后按照如图4所示的流程处理RBSP语法结构。输入的是NAL单元,输出结果是经过解码的当前图像的样值点。
NAL单元中分别包含了序列参数集和图像参数集。图像参数集和序列参数集在其他NAL单元传输过程中作为参考使用,在这些数据NAL单元的片头中,通过语法元素pic_parameter_set_id设置它们所使用的图像参数集编号;而相应的每个图像参数集中,通过语法元素seq_paramter_set_id设置他们使用的序列参数集编号。
6. 各分层结构的语法元素参考G50标准。