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

3.3.2 预测编码

预测编码是数据压缩中最常用的方法之一,例如,在脉冲编码调制(Differential Pulse Code Modulation,DPCM)中,就是用当前采样值与预测采样值的差进行编码的,即通过这种方式减少输出数据的体积。在视频压缩中,预测编码作为最核心的算法之一起到了重要作用。

在视频编码中,预测编码主要有两种方法。

◎ 帧内预测:帧内预测是根据当前帧已编码的数据进行预测,利用图像内相邻像素之间的相关性去除视频中的空间冗余。

◎ 帧间预测:帧间预测是将部分已编码的图像作为参考帧,利用前后帧之间的时间相关性去除视频中的时间冗余。

预测编码自早期视频编码标准开始就已引入规定的算法集合。在H.261和MPEG-2等早期标准中便引入了基于运动补偿预测的帧间编码算法,即通过视频帧中像素块的运动关系压缩时间冗余。在H.264及以后的标准中加入了帧内预测方法,即将视频帧按宏块和子宏块进行分割,并对子宏块用帧内预测方法压缩空间冗余。

帧内预测和帧间预测在编码过程中都需要将宏块分割后,在一个更小尺寸的子像素块内进行。在帧内预测中,一个子像素块先从已编码的相邻子像素块中获取参考像素,再从预设的预测模式候选中选择最佳模式进行编码,并将预测模式写入输出码流。在解码时通过解出的预测模式和从已解码的相邻像素信息生成重建像素块。

在帧间预测中,宏块分割生成的子像素块在参考帧中搜索最匹配的参考像素块,其中,匹配度最高的像素块相对于当前块在空间域的相对偏移称之为运动矢量(Motion Vector,MV)。将当前块与参考块的相对偏移称为运动矢量,是因为通过运动搜索得到的参考块,其内容可以作为当前像素块的运动起点,在某段时间内从参考像素块的位置运动到当前块的位置。在编码过程中,运动矢量和参考帧的索引号被编码到输出码流中,在解码端通过参考帧索引获得指定的参考帧,并通过运动矢量在参考帧中获取预测像素块。

编码运动矢量的方法通常不是直接编码运动矢量本身,而是将运动矢量分为运动矢量预测(Motion Vector Prediction,MVP)和运动矢量残差(Motion Vector Difference,MVD)两部分。其中,MVP是通过已编码完成的信息预测生成的,MVD是通过熵编码写入输出码流的。已完成编码的相邻像素块,其运动信息大概率具有相关性,甚至运动轨迹完全一致,因此通过预测的方式编码运动矢量在多数情况下可以有效减少码流的数据量。

在未发生场景切换的情况下,视频前后帧之间的相关性通常比视频帧内部相邻像素之间的相关性要大得多,因此帧间编码通常可以取得比帧内编码更高的压缩比。但是帧内编码的视频帧在解码时必须保证已经获取完整、且正确解码的参考帧,如果参考帧丢失或解码失败,则无法对当前帧进行正确解码,并且会导致后续解码失败。相比之下,虽然帧内编码的压缩比率较低,但是解码不需要依赖其他视频帧,因此可作为视频流的随机接入点和解码数据刷新点。