H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个数字视频编码标准。该标准最早来自于ITU-T的称之为H.26L的项目的开发。H.26L这个名称虽然不太常见,但是一直被使用着。H.264是ITU-T以H.26x系列为名称命名的标准之一,AVC是ISO/IEC MPEG一方的称呼
一、H264基本结构
H.264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的,而它的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer),其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。
二、VCL简介
VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的 VCL 数据,先被映射或封装进 NAL 单元(以下简称 NALU,Nal Unit) 中。每个 NALU 包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组 对应于视频编码的 NALU 头部信息。RBSP 的基本结构是:在原始编码数据的后面填加了结尾比特。一个 bit“1”若干比特“0”,以便字节对齐。
三、NALU简介
一帧图片经过H.264编码之后,就被编码为一个或多个片(slice),而装载着这些片(slice)的载体,就是NALU。帧(frame)是用作描述一张图片的,一帧(frame)对应一张图片,而片(slice),是 H.264 中提出的新概念,是通过编码图片后切分通过高效的方式整合出来的概念,一张图片至少有一个或多个片(slice)。 NALU 还有可能装载着其他用作描述视频的信息
四、slic概述
在H.264中设计Slice的目的主要在于防止误码的扩散。因为不同的slice之间,其解码操作是独立的。某一个slice的解码过程所参考的数据(例如预测编码)不能越过slice的边界。一帧图片可以包含一个或多个Slice,而每一个Slice包含整数个宏块(Macroblock),即每片(slice)至少一个宏块(Macroblock),最多时每片包含整个图像的宏块。分片头中包含着分片类型、分片中的宏块类型、分片属于那个图像以及对应的帧的设置和参数等信息。分片数据中则是宏块,就是存储像素数据的地方。
在进行RTP打包时,同一个slic之间的timestamp不变,并有标注启始标志和终止标志。
五、片类型及宏块类型
根据码流中不同的数据类型,H.264标准中共定义了5种Slice类型: I slice: 帧内编码。 P slice: 单向帧间编码。 B slice: 双向帧间编码 SI slice: 用于扩展档次中码流切换使用 SP slice: 用于扩展档次中码流切换使用 在I slice中只包含I宏块,不能包含P或B宏块;在P和B slice中,除了相应的P和B类型宏块之外,还可以包含I类型宏块
六、帧类型
I 帧: 帧内编码。 P 帧: 单向帧间编码。 B 帧: 双向帧间编码 IDR:(Instantaneous Decoding Refresh)--即时解码刷新。 I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。IDR会导致DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。
H264帧截图
SPS截图
IDR截图