FFmpeg音视频开发基础与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4.2 H.264的框架

与早期的视频编码标准类似,H.264同样使用块结构的混合编码框架,其主要结构如图3-3所示。

图3-3

在H.264编码过程中,每一帧的H图像都被分割为一个或多个条带(slice)进行编码。每个条带包含多个宏块(Macroblock,MB)。宏块是H.264中的基本编码单元,其包含一个16像素×16像素的亮度像素块和两个8像素×8像素的色度像素块,以及其他宏块头信息。当对一个宏块进行编码时,每个宏块都会被分割成多种不同大小的子块进行预测。帧内预测的块大小可能为16像素×16像素或者4像素×4像素,帧间预测或运动补偿的块有7种不同的形状:16像素×16像素、16像素×8像素、8像素×16像素、8像素×8像素、8像素×4像素、4像素×8像素和4像素×4像素。在早期的视频编码标准中,只能按照宏块或者半个宏块进行运动补偿,而H.264所采用的这种更加细分的宏块分割方法提供了更高的预测精度和编码效率。在变换编码方面,针对预测残差数据进行的变换块大小为 4像素×4像素或8像素×8像素。相比于仅支持8像素×8像素变换块的早期视频编码标准,H.264支持不同变换块大小的方法,避免了在变换与逆变换中经常出现的失配问题。

在H.264中,熵编码算法主要有上下文自适应的变长编码(CAVLC)算法和上下文自适应的二进制算术编码(CABAC)算法。我们可以根据不同的语法元素类型指定不同的编码算法,从而达到编码效率与运算复杂度之间的平衡。

H.264视的条带具有不同的类型,其中最常用的有I条带、P条带和B条带。另外,为了支持码流切换,在扩展档次中还定义了SI条带和SP条带。

◎ I条带:帧内编码条带,只包含I宏块。

◎ P条带:单向帧间编码条带,可能包含P宏块和I宏块。

◎ B条带:双向帧间编码条带,可能包含B宏块和I宏块。

在视频编码中采用的如预测编码、变化量化、熵编码等主要工作在条带层或以下,这一层通常被称为视频编码层(Video Coding Layer,VCL)。相对的,在条带层以上所进行的数据和算法通常称之为网络抽象层(Network Abstraction Layer,NAL)。设计网络抽象层的主要意义在于使H.264格式的视频数据更便于存储和传输。

为了适应不同的应用场景,H.264还定义了多种不同的档次。

◎ 基准档次(Baseline Profile):主要用于视频会议、可视电话等低延时实时通信领域。支持I条带和P条带,熵编码支持CAVLC算法。

◎ 主要档次(Main Profile):主要用于数字电视广播、数字视频数据存储等。支持视频场编码、B条带双向预测和加权预测,熵编码支持CAVLC算法和CABAC算法。

◎ 扩展档次(Extended Profile):主要用于网络视频直播与点播等。支持基准档次的所有特性,并支持SI条带和SP条带,支持数据分割以改进误码性能,支持B条带和加权预测,但熵编码不支持CABAC算法和场编码。

◎ 高档次(High Profile):适用于高压缩率和性能场景;支持Main Profile的所有特性,以及8像素×8像素的帧内预测、自定义量化、无损压缩格式和YUV采样格式等。