被压缩的视觉:视频编解码技术

文 | 何鸣 网易云信音视频算法工程师

导读:视觉是人类获得信息的主要方式,每天有大量的视频信息被生产并传输。未经压缩的视频内容占用的存储空间和传输带宽十分巨大,以常见的30fps高清视频为例,采用avi格式存储的YUV420视频流一分钟就有2GB大小,传输带宽需要40MB/s。所以我们日常从手机和电脑等电子设备上获得的视频信息都是被压缩后再传输和存储的,压缩这些视频信息的技术便称为视频编解码技术。

1. 颜色空间

我们人眼的视觉信息是由视杆细胞和视锥细胞获得的。视杆细胞主要感受光线的明暗变化,获取视觉的亮度信息,而视锥细胞可以感受到颜色。根据仿生的原理,计算机采集视频信号也采用亮度信息和速度信息分别采集的方式。由于人眼的视杆细胞数量比视锥细胞的数量多很多,所以人眼对于亮度信息更加敏感,所以在采集视频信息时,常采用YUV420的格式采集。具体操作如图1中所示,四个亮度像素Y共用一组红色和蓝色的色度像素。

图1 YUV420颜色空间

采集来的像素在计算机内部都采用2进制的形式存储,为了表示人眼视觉的颜色空间,在计算机内部一般采用256色存储,即亮度信息和色度信息的取值范围都是0到255。通过不同的数值组合可以表示出不同的颜色,例如,YUV都是255时是粉色,YUV都是0时是深绿色。这样为了表示一个像素需要1.5字节的数据,而一幅图像中有成千上万个像素。一幅720p分辨率的视频包含92万个像素,一幅1080p分辨率的视频包含207万个像素,而一秒钟的视频包含30帧图像。对于数据量巨大的YUV视频数据,需要压缩后才能存储与传输。

2. 压缩原理

压缩视频信息与压缩文件信息不同,在视频中存在着大量的冗余信息。如图2所示,相邻帧之间的相似性会有时间上的冗余,同一帧的相邻块之间存在着空间上的冗余,由于人眼感知对于低频信息更敏感,所以存在着感知上的冗余。

图2 视频中的冗余信息

视频压缩的基本原理就是去除这些冗余信息,将视频压缩300到500倍,常见的压缩方法有预测编码、变换编码和熵编码技术。如图3所示,将输入的视频信息按照各个编码模块进行处理,输出码流的过程称为视频编码过程,再通过对应的熵解码、变换解码和预测解码过程,将码流还原成YUV420视频流的过程称为视频解码过程。可以将视频编解码的过程看作是压缩和解压缩的过程,但在该过程中,由于压缩的算法有所差异,所以解码的算法必须对应着编码的算法,不同的编解码算法称为视频标准。

图3 视频编码技术

现在常用的视频标准,例如H.26x系列标准,其中最常用的是H.264标准,由于开源编码器x264的普及,也将这代标准称为x264标准。H.26x系列标准的研发与进展一直是行业的标杆,最新的H.266/VVC标准加入许多新技术,而这些技术可以简单概括为以下几个方面:

图4 H.265的块划分示意图

块划分技术:除深度学习技术外,传统的视频编解码技术都是按块去处理视频,而且趋势是最大块越来越大,最小块越来越小,块的类型越来越多。对于相对静止的区域,采用大块可以提高压缩效率,使用一两个标志位或者很少的残差数据就可以表示一个大块,可以极大的压缩视频画面。对于运动比较多的区域,采用小块可以提高画质质量,将运动的细节更完整的表示出来。为了更精细的划分运动和静止的区域,块划分技术采用各种形状的矩形块代替原有的方形块划分。在工程落地方面,越来越复杂的块划分技术浪费大量的计算资源,所以很多快速算法都是针对块划分模式进行预测,将机器学习算法和深度学习算法应用到块划分预测过程中,可以在质量损失微乎其微的情况下,快速得出块划分模式。

图5 帧内预测示意图

帧内预测:帧内预测属于预测编码的范畴,在视频序列中,有一些帧和块的预测信息无法从参考帧中获得,这样的帧被称为I帧或帧内预测块。在I帧中所有的块都是帧内预测块,而帧内预测块可以存在于I帧或P帧和B帧中。具体怎么实现帧内预测呢,对于一个帧内预测块,首先在该块周围补偿出一圈像素(对于边缘部分,可以采用扩边的方式),根据这圈像素值,采用角度预测或者平面预测的方式补偿出当前块,再通过与原图比较,选择损失最小的预测模式。由于帧内预测补偿时采用的像素值都来自于当前帧,不需要参考帧信息,所以帧内预测常用于序列首帧或者视频信息变化比较大的区域。

图6 帧间预测示意图

帧间预测:与帧内预测相对应的是帧间预测技术,他们同属于预测编码技术。帧间预测的参考图像信息来自于参考帧,所以在视频首帧或者参考帧缺失的情况下不能使用帧间预测技术。帧间预测的关键过程便是运动搜索与运动补偿过程。运动搜索过程负责搜索出参考帧上最接近当前块的图像块,并生成运动矢量,运动补偿则根据参考帧信息生成当前帧信息。根据最新的帧间预测技术,运动信息可以包含平移、缩放和旋转。由于运动矢量指向的位置未必是整数像素的位置,所以在运动补偿过程中还涉及到亚像素补偿技术。通过帧间预测可以极大提高视频的压缩率,例如在参考帧中有着相似度很高的块,则可以对当前块采用skip的模式编码,仅需一个标志位即可编码原有块内所有的YUV信息。

图7 16x16DCT变换核

变换量化:变换与量化技术是配套使用的,在刚刚的分析中,由于人眼对于高频信息的不敏感,需要对高频信息进行压缩,在频域更容易对其进行操作,所以需要对图像进行变换。常用的变换方式有哈达玛、整数DCT和整数DST,由于有预测编码技术的存在,所以变换通常在残差信息上操作,根据不同的压缩率要求,可以对变换后的系数进行量化,仅保留人眼更敏感的低频信息。在解码过程中,需要配套的反量化和反变换技术,将压缩后的残差系数还原出来。

图8 CABAC编码器框架

熵编码:对于标志位和残差系数,还需要一套编码技术进一步压缩这些信息,对于一些关键信息,可以采用指数哥伦布,游程编码等方式压缩,对于大量的残差系数和图像帧内的编码信息,现在常用基于上下文模型的熵编码技术进行压缩。熵编码的基本原理是对小概率符号使用更多比特编码,而大概率符号则采用较少的比特编码,通过上下文模型,大部分的大概率符号都可以被压缩。区别于预测编码和变换量化过程,熵编码过程是无损的。

图9 环路滤波器SAO的4种边界补偿模式

环路滤波:对于参考帧来说,由于后续的视频都是依据前面视频帧的信息补偿出来,所以参考帧中出现的损失和错误,会延续到整个序列,随着运动补偿的过程,或扩散到整个视频帧当中。为了降低视频的损失,在每一帧编码完之后,都会对其进行后处理,处理这些视频帧的滤波器被称为环路滤波器,使其更加接近于原始视频序列。现阶段,许多基于深度学习的后处理技术被应用到环路滤波器当中,在编解码过程中起到很好的效果。

图10 WPP并行技术示意图

除了以上技术,在工程化落地过程中,码控技术、并行技术、指令集技术同样影响编码器效果。视频编解码技术包含着一系列算法的技术集成,将这些技术组合使用,形成各类视频编解码标准。除H.26x视频标准之外,还存在着开放视频标准联盟的AV1标准,国产的AVS标准等。

3. 视频编码技术的挑战与发展

根据现在的技术需求,未来的视频编码技术需要面对更高分辨率、更高帧率、更广色域及HDR视频的挑战。同时,面对更多形式的视频内容,例如全景视频、点云、深度学习特征图等,视频编码技术需要与时俱进,不断发展。现有技术方兴未艾,未来技术仍然可期。