H264简介
H264简介
H.264,又称为MPEG-4 Part 10,Advanced Video Coding。
- 译为:MPEG-4第10部分,高级视频编码
- 简称:MPEG-4 AVC
H.264是迄今为止视频录制、压缩和分发的最常用格式。截至2019年9月,已有91%的视频开发人员使用了该格式。H.264提供了明显优于以前任何标准的压缩性能。H.264因其是蓝光盘的其中一种编解码标准而著名,所有蓝光盘播放器都必须能解码H.264。
分层目的
视频编码层VCL
VCL数据是编码处理的输出,表示被压缩编码后的视频数据序列。【编码/压缩、切分】
网络提取层NAL
VCL数据传输和存储之前,这些VCL数据,会被封装进NAL单元中。【打包】
编码过程与原理
H.264的编程过程比较复杂,本文只介绍大体的框架和脉络,具体细节就不展开了。
大体可以归纳为以下几个主要步骤:
- 划分帧类型
- 帧内/帧间编码
- 变换 + 量化
- 滤波
- 熵编码
划分帧类型
IPB帧
I 帧
帧内编码帧(Intra Coded Picture),也叫关键帧,采用帧内压缩去掉空间冗余信息。
P帧
前向预测编码帧(predictive-frame),通过将图像序列中前面已经编码帧的时间冗余
信息来压缩传输数据量的编码图像。参考前面的 I 帧或者 P 帧。
B 帧
双向预测内插编码帧 双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的冗余信息,来压缩传输数据量的编码图像,也称为双向编码帧。参考前面一个的 I 帧或者 P 帧及其后面的一个 P 帧。

在较早的视频编码标准(例如MPEG-2)中,P帧只能使用一个参考帧,而一些现代视频编码标准(比如H.264),允许使用多个参考帧。

PTS 和 和 DTS
DTS(Decoding Time Stamp)是标识读入内存中 bit 流在什么时候开始送入解码器中进行
解码。也就是解码顺序的时间戳。
PTS(Presentation Time Stamp)用于度量解码后的视频帧什么时候被显示出来。在没有
B 帧的情况下,DTS 和 PTS 的输出顺序是一样的,一旦存在 B 帧,PTS 和 DTS 则会不同。也就是显示顺序的时间戳。
GOP
即 Group of picture(图像组),指 两个 I 帧之间的距离,Reference(参考周期)指两个 P 帧之间的距离。

一个 I 帧所占用的字节数大于一个 P 帧,一个 P 帧所占用的字节数大于一个 B 帧。所以
在码率不变的前提下,GOP 值越大,P、B 帧的数量会越多,平均每个 I、P、B 帧所占用
的字节数就越多,也就更容易获取较好的图像质量;Reference 越大,B 帧的数量越多,同理也更容易获得较好的图像质量。
简而言之:
字节大小:I > P > B
解码顺序:I -> P -> B
GOP的长度
GOP的长度表示GOP的帧数。GOP的长度需要控制在合理范围,以平衡视频质量、视频大小(网络带宽)和seek效果(拖动、快进的响应速度)等。
- 加大GOP长度有利于减小视频文件大小,但也不宜设置过大,太大则会导致GOP后部帧的画面失真,影响视频质量
- 由于P、B帧的复杂度大于I帧,GOP值过大,过多的P、B帧会影响编码效率,使编码效率降低
- 如果设置过小的GOP值,视频文件会比较大,则需要提高视频的输出码率,以确保画面质量不会降低,故会增加网络带宽
- GOP长度也是影响视频seek响应速度的关键因素,seek时播放器需要定位到离指定位置最近的前一个I帧,如果GOP太大意味着距离指定位置可能越远(需要解码的参考帧就越多)、seek响应的时间(缓冲时间)也越长
GOP的类型
GOP又可以分为开放(Open)、封闭(Closed)两种。
- Open
- 前一个GOP的B帧可以参考下一个GOP的I帧
- Closed
- 前一个GOP的B帧不能参考下一个GOP的I帧
- GOP不能以B帧结尾


需要注意的是:
- 由于P帧、B帧都对前面的参考帧(P帧、I帧)有依赖性,因此,一旦前面的参考帧出现数据错误,就会导致后面的P帧、B帧也出现数据错误,而且这种错误还会继续向后传播
- 对于普通的I帧,其后的P帧和B帧可以参考该普通I帧之前的其他I帧
在Closed GOP中,有一种特殊的I帧,叫做IDR帧(Instantaneous Decoder Refresh,译为:即时解码刷新)。
- 当遇到IDR帧时,会清空参考帧队列
- 如果前一个序列出现重大错误,在这里可以获得重新同步的机会,使错误不会继续往下传播
- 一个IDR帧之后的所有帧,永远都不会参考该IDR帧之前的帧
- 视频播放时,播放器一般都支持随机seek(拖动)到指定位置,而播放器直接选择到指定位置附近的IDR帧进行播放最为便捷,因为可以明确知道该IDR帧之后的所有帧都不会参考其之前的其他I帧,从而避免较为复杂的反向解析

帧内/帧间编码
I帧采用的是帧内(Intra Frame)编码,处理的是空间冗余。
P帧、B帧采用的是帧间(Inter Frame)编码,处理的是时间冗余。

划分宏块
在进行编码之前,首先要将一张完整的帧切割成多个宏块(Macroblock),H.264中的宏块大小通常是16x16。
宏块可以进一步拆分为多个更小的变换块(Transform blocks)、预测块(Prediction blocks)。
- 变换块的尺寸有:16x16、8x8、4x4
- 预测块的尺寸有:16×16、16×8、8×16、8×8、8×4、4×8、4×4

帧内编码
帧内编码,也称帧内预测。以4x4的预测块为例,共有9种可选的预测模式。


利用帧内预测技术,可以得到预测帧,最终只需要保留预测模式信息、以及预测帧与原始帧的残差值。
编码器会选取最佳预测模式,使预测帧更加接近原始帧,减少相互间的差异,提高编码的压缩效率。
帧间编码
帧间编码,也称帧间预测,用到了运动补偿(Motion compensation)技术。
编码器利用块匹配算法,尝试在先前已编码的帧(称为参考帧)上搜索与正在编码的块相似的块。如果编码器搜索成功,则可以使用称为运动矢量的向量对块进行编码,该向量指向匹配块在参考帧处的位置。
在大多数情况下,编码器将成功执行,但是找到的块可能与它正在编码的块不完全匹配。这就是编码器将计算它们之间差异的原因。这些残差值称为预测误差,需要进行变换并将其发送给解码器。
综上所述,如果编码器在参考帧上成功找到匹配块,它将获得指向匹配块的运动矢量和预测误差。使用这两个元素,解码器将能够恢复该块的原始像素。
如果一切顺利,该算法将能够找到一个几乎没有预测误差的匹配块,因此,一旦进行变换,运动矢量加上预测误差的总大小将小于原始编码的大小。
如果块匹配算法未能找到合适的匹配,则预测误差将是可观的。因此,运动矢量的总大小加上预测误差将大于原始编码。在这种情况下,编码器将产生异常,并为该特定块发送原始编码。
DCT 变换与量化
接下来对残差值进行DCT变换(Discrete Cosine Transform,译为离散余弦变换)。
规格
H.264的主要规格有:
- Baseline Profile(BP)
- 支持I/P帧,只支持无交错(Progressive)和CAVLC
- 一般用于低阶或需要额外容错的应用,比如视频通话、手机视频等即时通信领域
- Extended Profile(XP)
- 在Baseline的基础上增加了额外的功能,支持流之间的切换,改进误码性能
- 支持I/P/B/SP/SI帧,只支持无交错(Progressive)和CAVLC
- 适合于视频流在网络上的传输场合,比如视频点播
- Main Profile(MP)
- 提供I/P/B帧,支持无交错(Progressive)和交错(Interlaced),支持CAVLC和CABAC
- 用于主流消费类电子产品规格如低解码(相对而言)的MP4、便携的视频播放器、PSP和iPod等
- High Profile(HiP)
- 最常用的规格
- 在Main的基础上增加了8x8内部预测、自定义量化、无损视频编码和更多的YUV格式(如4:4:4)
- High 4:2:2 Profile(Hi422P)
- High 4:4:4 Predictive Profile(Hi444PP)
- High 4:2:2 Intra Profile
- High 4:4:4 Intra Profile
- 用于广播及视频碟片存储(蓝光影片),高清电视的应用

浙公网安备 33010602011771号