视频信息中通常包含的冗余有三种:空间冗余、时间冗余和统计冗余。处理这三种冗余信息通常采用不同的方式:

  • 空间冗余采用帧内预测编码压缩;
  • 时间冗余采用运动搜索和运动补偿压缩;
  • 统计冗余采用熵编码压缩。

在上述的各种编码技术中,帧内预测是非常重要的一种。因为在各种视频帧类型中,I帧(包括IDR帧等)全部采用帧内预测,I帧的压缩比率通常比P和B帧更低,因此帧内预测编码的效率对视频整体平均码率具有较大影响。另一方面,I帧通常都会作为P/B帧解码过程中的参考帧,如果I帧的编码出现了错误,那么不仅仅是该I帧出现错误,参考该I帧的P/B帧也同样不能正确解码。

1. MPEG-1/MPEG-2帧内编码

在早期的视频编码标准中就已经存在了帧内编码的方法。如MPEG-1/MPEG-2等早期的标准中,帧的类型已经定义了I/P/B三种类型,分别表示帧内编码帧、预测编码帧和双向预测编码帧。然而在H.264/AVC之前的标准中,编码I帧时并未采用预测编码,只有编码P/B帧时采用了帧间预测编码。在MPEG-1/MPEG-2等编码标准中,I帧的编码采用的是DCT-RLC的方法进行编码。I帧编码的主要流程如下图:

videocopilot插件包百度云(videocopilotelement 3D)

videocopilot插件包百度云(videocopilotelement 3D)

由于未采用预测算法,这种帧内编码的压缩效率相对较低,后期已经不能适应整体提升压缩比率的要求。

2. 预测编码的基本原理

对于存在前后相关性的信息,预测编码是一种非常简便且有效的方法。此时预测编码输出的不再是原始的信号值,而是信号的预测值与实际值的差。预测编码如此设计的出发点在于,由于前后存在相关性,相邻信号存在大量相同或相近的现象,通过计算其差值,可以减少大量保存与传输原始信息的数据体积。

我们用几个简单的例子来说明这个问题。假设有下面的一串数字:

1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3

我们可以用如下的信息来表示这串数字信息:

Pred = 1;
Residual = { (1, 5), (2, 11) };

这些信息表示,目标信号的预测值为1,在第5和12个元素的位置存在残差,分别为1和2。

我们举另外一个例子,假设有下面一串数字:

0, 1, 2, 3, 5, 5, 6, 7, 8, 9, 10, 9, 12

对于这部分信号,可以如下表示:

Pred = n;
Residual = {(4, 1), (-2, 11)};

其表示的含义类似于前例。

从另一方面考虑,视频信息在输出码流之前需要经过量化操作。量化完成后的信息用数字化表示,其所需要的位数与表示信息的范围与方差有关。对于取值范围小、方差较小的信息,量化器所需要的比特范围就更小,每个像素数的比特位数便更小。统计表明,相比于原始的图像像素,预测残差的方差与动态范围远小于原始图像像素。通过预测编码,不仅降低了表示像素信息所需要的比特数,还可以保留视频图像的画面质量不至于降低。

内容摘自《FFmpeg音视频开发基础与实战》作者汶杰老师的文章。

videocopilot插件包百度云(videocopilotelement 3D)