音视频高手(三)-H264编码基础帧内预测,帧间预测

2,874 阅读8分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

音视频高手进阶(三),争取让小白都能看懂,由于篇幅原因,一次无法完全整合成一篇文章,所以分几次发表,如有需要完整PDF文档,可去我主页简介联系我拿PDF版本

H264编码(帧内预测)

预测? 总感觉这个词有股神奇的力量,能够将你引向未来

它又有什么样的作用呢?

帧内预测可以防止视频产生锯齿现象。

在帧内预测模式中,预测块P是基于已编码重建块和当前块形成的。对亮度像素而言,P块用于4×4子块或者16×16宏块的相关操作。4×4亮度子块有9种可选预测模式,独立预测每一个4×4亮度子块,适用于带有大量细节的图像编码;16×16亮度块有4种预测模式,预测整个16×16亮度块,适用于平坦区域图像编码;色度块也有4种预测模式,类似于16×16亮度块预测模式。编码器通常选择使P块和编码块之间差异最小的预测模式。

4×4亮度预测模式

如图6.14所示,4×4亮度块的上方和左方像素A~M为已编码和重构像素,用作编解码器中的预测参考像素。a~p为待预测像素,利用A~M值和9种模式实现。其中模式2(DC预测)根据A~M中已编码像素预测,而其余模式只有在所需预测像素全部提供才能使用。图6.15箭头表明了每种模式预测方向。对模式3~8,预测像素由A~M加权平均而得。例如,模式4中,d=round(B/4+C/2+D/4)。

1.jpg

2.jpg

3.jpg

模式描 述
模式0(垂直)由A、B、C、D 垂直推出相应像素值
模式1(水平)由I、J、K、L 水平推出相应像素值
模式2(DC)由AD 及IL 平均值推出所有像素值
模式3(下左对角线)由45°方向像素内插得出相应像素值
模式4(下右对角线)由45°方向像素内插得出相应像素值
模式5(右垂直)由26.6°方向像素值内插得出相应像素值
模式6(下水平)由26.6°方向像素值内插得出相应像素值
模式7(左垂直)由26.6° 方向像素值内插得出相应像素值
模式8(上水平)由26.6° 方向像素值内插得出相应像素值

表2 16×16预测模式

模式描 述
模式0(垂直)由上边像素推出相应像素值
模式1(水平)由左边像素推出相应像素值
模式2(DC)由上边和左边像素平均值推出相应像素值
模式3(平面)利用线形“plane”函数及左、上像素推出相应像素值,适用于亮度变化平缓区域

8×8色度块预测模式

每个帧内编码宏块的8×8色度成分由已编码左上方色度像素预测而得,两种色度成分常用同一种预测模式。

4种预测模式类似于帧内16×16预测的4种预测模式,只是模式编号不同。其中DC(模式0)、水平(模式1)、垂直(模式2)、平面(模式3)。

对于当前块C, 编解码器按照如下方法计算

probableprediction mode=
​
•          min{prediction mode of A, predictionmodes of B}
​
当A (或者 B)的预测模式不可用时,
​
•         prediction mode of A2.

例如

A 和 B块的预测模式分别为 3 和1

   most probable mode for block C =1

编码器为每个4x4 块发送一个标记 flag,解码器按照如下方式 解码

Ifflag==1, prediction mode=most_probable_mode
​
Ifflag==0
​
   If rem_intra4×4_pred_mode< most_probable_mode
​
•     prediction mode=rem_intra4×4_pred_mode
​
   else
​
•     prediction mode=rem_intra4×4_pred_mode+1

这样表示9中预测模式只需要8个值 (0 to 7)

H264基础02(帧间预测)

H.264 帧间预测是利用已编码视频帧/场和基于块的运动补偿的预测模式。与以往标准帧间预测的区别在于块尺寸范围更广(从16×16 到4×4)、亚像素运动矢量的使用(亮度采用1/4 像素精度MV)及多参考帧的运用等等。

树状结构运动补偿

每个宏块(16×16 像素)可以4 种方式分割:一个16×16,两个16×8,两个8×16,四个8×8。其运动补偿也相应有四种。而8×8 模式的每个子宏块还可以四种方式分割:一个8×8,两个4×8 或两个8×4 及4 个4×4。这些分割和子宏块大大提高了各宏块之间的关联性。这种分割下的运动补偿则称为树状结构运动补偿。

每个分割或子宏块都有一个独立的运动补偿。每个MV 必须被编码、传输,分割的选择也需编码到压缩比特流中。对大的分割尺寸而言,MV 选择和分割类型只需少量的比特,但运动补偿残差在多细节区域能量将非常高。小尺寸分割运动补偿残差能量低,但需要较多的比特表征MV 和分割选择。分割尺寸的选择影响了压缩性能。整体而言,大的分割尺寸适合平坦区域,而小尺寸适合多细节区域。

宏块的色度成分(Cr 和Cb)则为相应亮度的一半(水平和垂直各一半)。色度块采用和亮度块同样的分割模式,只是尺寸减半(水平和垂直方向都减半)。例如,8×16 的亮度块相应色度块尺寸为4×8,8×4 亮度块相应色度块尺寸为4×2 等等。色度块的MV 也是通过相应亮度MV 水平和垂直分量减半而得。

运动矢量

帧间编码宏块的每个分割或者子宏块都是从参考图像某一相同尺寸区域预测而得。两者之间的差异(MV)对亮度成分采用1/4 像素精度,色度1/8 像素精度。亚像素位置的亮度和色度像素并不存在于参考图像中,需利用邻近已编码点进行内插而得。图6.6.3 中,当前帧的4×4 块通过邻近参考图像相应区域预测。如果MV 的垂直和水平分量为整数,参考块相应像素实际存在(灰色点)。如果其中一个或两个为分数,预测像素(灰色点)通过参考帧中相应像素(白色点)内插获得。

内插像素生成:

首先生成参考图像亮度成分半像素像素。半像素点(如b,h,m)通过对相应整像素点进行6 抽头滤波得出,权重为(1/32 ,-5/32 ,5/8, 5/8, -5/32, 1/32)。b 计算如下:

类似的,h 由A、C、G、M、R、T 滤波得出。一旦邻近(垂直或水平方向)整像素点的所有像素都计算出,剩余的半像素点便可以通过对6 个垂直或水平方向的半像素点滤波而得。例如,j 由cc, dd, h,m,ee,ff 滤波得出。这里说明的是,6 抽头滤器比较复杂,但可明显改善运动补偿性能。

半像素点计算出来以后,1/4 像素点就可通过线性内插得出,如下图所示。1/4 像素点(如a,c, i, k, d, f, n, q)由邻近像素内插而得,如

剩余1/4 像素点(p, r)由一对对角半像素点线性内插得出。如,e 由b 和h 获得。

相应地,色度像素需要1/8 精度地MV,也同样通过整像素地线性内插得出,如下图所示。

当dx=2,dy=3 时,

MV预测

每个分割MV 的编码需要相当数目的比特,特别是使用小分割尺寸时。为减少传输比特数,可利用邻近分割的MV 较强的相关性,MV 可由邻近已编码分割的MV 预测而得。预测矢量MVp 基已计算MV 和MVD(预测与当前的差异)并被编码和传送。MVp 则取决于运动补偿尺寸和邻近MV 的有无。

E为当前宏块或宏块分割子宏块。A、B、C 分别为E 的左、上、右上方的三个相对应块。

如果E 的左边不止一个分割,取其中最上的一个为A;上方不止一个分割时,取最左边一个为B。图显示所有分割有相同尺寸时的邻近分割选择。下图给出了不同尺寸时临近分割的选择。

B 片预测

B片中的帧间编码宏块的每个子块都是由一个或两个参考图像预测而得。该参考图像在当前图像的前面或者后面。参考图像存储于编解码器中,其选择有多种方式。下图显示了三种方式:一个前向和一个后向的(类似于MPEG 的B 图像预测);两个前向;两个后向。