H.264数据元素:序列、图像、片、宏块、块

在H.264中,句法元素被组织成五个层次:序列(sequence)、图像(frame/field-picture)、片(slice)、宏块(macroblock)、子块(sub-block)。

图像(picture)、帧(frame)、场(field)
视频压缩中,一幅图像(picture)可以分成一帧(frame)或两场(field)。一般来讲,picture可以分为若干个宏块(macroblock),每个宏块可以采用不同的预测编码类型,整幅图像各宏块的类型可以不同。例如I picture只包含intra MB, P picture包含intra MB或predicted MB, B picture包含intra, predicted, 或bi-predicted MB。

I图像:I宏块

P图像:I宏块、P宏块

B图像:I宏块、P宏块、B宏块

片(slice)
在H.264中,一幅图像可以编码为一个或多个片(slice),每个slice由宏块组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。宏块是H.264编码的基本单位,可以采用不同的编码类型。slice共有5种类型。slice的目的是为了限制误码的扩散和传输,使编码片相互间保持独立。一个slice编码之后被打包进一个NALU,NALU除了容纳slice还可以容纳其它数据,如序列参数集SPS、PPS、SEI等。

类型

描述

支持的框架

I frames/slices (Intra)

I宏块

全部

P frames/slices (Predicted)

I宏块、P宏块

全部

B frames/slices (Bi-Predicted)

I宏块、B宏块

扩展和主

SI-frames/slices (switching I)

SI宏块(一种特殊的帧内编码宏块),用于不同编码流之间的切换

扩展

SP-frames/slices (switching P)

I宏块、P宏块,用于不同编码流之间的切换

扩展

帧内编码帧/I 帧/关键帧

Intra codedframes/ Intra coded slices/ I-frames/ Key frames

在I帧中,所有宏块都采用帧内预测的方式,因此解码时仅用I帧的数据就可重构完整图像,不需要参考其他画面而生成。I帧可以用来快进快退,作为随机访问的参考点。I帧用来作为P帧和B帧的参考帧,其质量直接影响到其后各帧的质量。I帧描述了图像背景和运动主体的详情,可以帮助场景切换时重置画面质量。当场景进行切换时,可以切换I帧从而更加高效地压缩P帧和B帧(当然这要求编码器要有场景切换检测功能)。由于I帧仅进行帧内预测,没有进行运动估计等帧间预测,因此I帧的码率比较高。

在H.264中规定了两种类型的I帧:普通I帧(normal Iframes)和IDR帧(InstantaneousDecoding Refresh, 即使解码刷新)。IDR帧实质也是I帧,使用帧内预测。IDR帧的作用是立即刷新,会导致DPB(Decoded Picture Buffer参考帧列表)清空,而I帧不会。所以IDR帧承担了随机访问功能,一个新的IDR帧开始,可以重新算一个新的序列开始编码,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。如果一个视频中没有IDR帧,这个视频是不能随机访问的。所有位于IDR帧后的B帧和P帧都不能参考IDR帧以前的帧,而普通I帧后的B帧和P帧仍然可以参考I帧之前的其他帧。IDR帧阻断了误差的积累,而I帧并没有阻断误差的积累。

I 帧编码的基本流程:

1、进行帧内预测,决定所采用的帧内预测模式。

2、像素值减去预测值,得到残差。

3、对残差进行变换和量化。

4、变长编码和算术编码。

5、重构图像并滤波,得到的图像作为其它帧的参考帧。

预测帧/P帧/前向预测编码帧

P帧属于前向预测的帧间编码,仅参考前面的最靠近它的I帧或者P帧进行帧间预测。编码端在参考帧中找到P帧某点的预测值以及运动矢量,相减获取预测差值,将预测差值和运动矢量进行编码后传输。解码端根据运动矢量从I帧中找出P帧某点的预测值并与预测差值相加得到P帧某点样值,从而可得到完整的P帧。在以前的标准中(如MPEG-2),P帧解码时只使用前一帧作为参考,在H.264中,解码时可以使用多帧已解码的图像作为参考。P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。由于P帧是参考帧,它可能造成解码错误的扩散。由于是差值传送,P帧的压缩比较高。在H.264基本配置中仅仅存在I帧和P帧,不存在B帧。

B帧/双向预测编码帧
B帧以前面的I或P帧和后面的P帧为参考帧进行预测,编码找出B帧某点的预测值和两个运动矢量,并取预测差值和运动矢量传送。解码端根据运动矢量在两个参考帧中找出预测值并与差值求和,得到B帧某点样值,从而可得到完整的B帧。在以前的标准中(如MPEG-2),B帧不作为参考帧,可以使用较低的码率、降低图像质量而不会影响后续图像,解码时使用两帧图像作为参考。在H.264中,B帧可以作为参考帧,解码时可以使用一幅、两幅或多幅图像作为参考,图像帧的传输顺序和显示顺序是不同的。B帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确。

P 帧和 B 帧编码的基本流程:

1、进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P帧只参考前面的帧,B帧可参考后面的帧。

2、进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式。

3、计算实际值和预测值的差值。

4、对残差进行变换和量化。

5、熵编码,如果是帧间编码模式,编码运动矢量。

宏块(Macro Block)
宏块是编码处理的基本单元,通常宏块大小为16x16个像素。一个编码图像首先要划分成多个块(4x4 像素)才能进行处理,显然宏块应该由整数个块组成。宏块分为I、P、B宏块:I宏块(帧内预测宏块)只能利用当前片中已解码的像素作为参考进行帧内预测;P宏块(帧间预测宏块)可以利用前面已解码的图像作为参考图像进行帧内预测;B宏块(帧间双向预测宏块)则是利用前后向的参考图像进行帧内预测。

文章来源:ivy_reny的专栏