H.264 码流结构解析

1.  H.264 简介

MPEGMoving Picture Experts Group)和 VCEGVideo Coding Experts Group)已经联

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

AVCAdvanced 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 的基本结构是:在原始编码数据的后面填加了结尾

比特。一个 bit1”若干比特“0”,以便字节对齐。

NAL头„„ RBSPNALRBSPNALRBSP„„

1 NAL 单元序列

3.  H.264 传输

H.264 的编码视频序列包括一系列的 NAL 单元,每个 NAL 单元包含一个 RBSP,见表

1。编码片(包括数据分割片 IDR 片)和序列 RBSP 结束符被定义为 VCL NAL 单元,其余

NAL 单元。典型的 RBSP 单元序列如图 2 所示。每个单元都按独立的 NAL 单元传送。

单元的信息头(一个字节)定义了 RBSP 单元的类型,NAL 单元的其余部分为 RBSP 数据。

SPS P SEIPPSI片图像定界符P

2 RBSP 序列举例

RBSP 类型  描述

参数集 PS  序列的全局,如图像尺寸、视频格式等

增强信息 SEI  视频序列解码的增强信息

图像定界符 PD  视频图像的边界

编码片  片的头信息和数据

数据分割  DP 片层的数据,用于错误恢复解码

序列结束符  表明下一图像为 IDR 图像

流结束符  表明该流中已没有图像

填充数据  哑元数据,用于填充字节

1 RBSP 描述

例子:

 AnyChat音视频互动开发平台(SDK是一套跨平台的即时通讯解决方案,基于先进的H.264视频编码标准、AAC音频编码标准与P2P技术,整合了佰锐科技在音视频编码、多媒体通讯领域领先的开发技术和丰富的产品经验而设计的高质量、宽适应性、分布式、模块化的网络音视频互动平台(支持WindowsMobileLinuxAndroid等平台)。

4.  H.264 码流结构图

起始码Nal Unit „„ RTP Packet „„

层二:NAL Unit

层一:A. Annexb格式 B. RTP格式

NALU Header NALU 主体

层三:Slice

Slice Header Slice Data

层四:Slice Data

flagsMacroblock Layer  Macroblock Layer  „„

层五:PCM

mb_typePCM Data mb_type

Sub_mb_pred

mb_pred

Residual Data

其他宏块类型

层六:Residual

Residual Block

3 H.264 码流分层结构

起始码:如果 NALU 对应的 Slice 为一帧的开始,则用 4 字节表示,即 0x00000001

否则用 3 字节表示,0x000001

NAL Headerforbidden_bitnal_reference_bit(优先级),nal_unit_type(类型)。

脱壳操作:为了使 NALU 主体不包括起始码,在编码时每遇到两个字节(连续)的 0

就插入一字节 0x03,以和起始码相区别。解码时,则将相应的 0x03 删除掉。

NALU 类型:

Nal_unit_type  NAL 类型  C

未使用

不分区、非 IDR 图像的片  234

片分区 A  2

片分区 B  3

片分区 C  4

5  IDR 图像中的片  23

补充增强信息单元(SEI)  5

序列参数集  0

图像参数集  1

分界符  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_idcNRI)用于在重建过程中标记一个 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=3 DPA=4

4 NAL 单元解码

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

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

样值点。

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

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

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

语法元素 seq_paramter_set_id 设置他们使用的序列参数集编号。

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