搜档网
当前位置:搜档网 › 51CTO下载-H.264码流结构解析

51CTO下载-H.264码流结构解析

51CTO下载-H.264码流结构解析
51CTO下载-H.264码流结构解析

H.264 码流结构解析

1. H.264 简介

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

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

为A VC(Advanced Video Coding),也被称为ITU-T H.264 建议和MPEG-4 的第10 部分的

标准,简称为H.264/A VC 或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头……RBSPNAL头RBSPNAL头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片SEIPPSI片图像定界符P片

图2 RBSP 序列举例

RBSP 类型描述

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

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

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

编码片片的头信息和数据

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

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

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

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

表1 RBSP 描述

例子:

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

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 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=3 DPA=4

图4 NAL 单元解码

NAL 单元解码的流程为:首先从NAL 单元中提取出RBSP 语法结构,然后按照如图4 所示的流程处理RBSP 语法结构。输入的是NAL 单元,输出结果是经过解码的当前图像的

样值点。

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

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

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

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

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

相关主题