从 20 世纪 90 年代以来,数字音视频编解码技(jì )术迅速发展,一直是國(guó)内外研究的热点领域。随着5G的成熟和广泛商(shāng)用(yòng),带宽已经越来越高,传输音视频变得更加容易。视频直播、视频聊天,已经完全融入了每个人的生活。
视频為(wèi)何如此普及呢(ne)?是因為(wèi)通过视频能(néng)方便快捷地获取到大量信息。但视频数据量非常巨大,视频的网络传输也面临着巨大的挑战。于是视频编解码技(jì )术就出场了。
具(jù)體(tǐ)到实时视频场景,不仅仅是数据量的问题,实时通信对时延要求、设备适配、带宽适应的要求也非常高,要解决这些问题,始终离不开视频编解码技(jì )术的范畴。
本文(wén)将从视频编解码技(jì )术的基础知识入手,引出视频编解码技(jì )术中(zhōng)非常基础且重要的预测技(jì )术,學(xué)习帧内预测和帧间预测的技(jì )术原理(lǐ)。
如果你是音视频技(jì )术初學(xué)者,以下3篇入门级干货非常推荐一读:
《实时音视频面视必备:快速掌握11个视频技(jì )术相关的基础概念》
首先,来复习一下视频编解码方面的理(lǐ)论常识。
视频是由一系列图片按照时间顺序排列而成:
每一张图片為(wèi)一帧;
每一帧可(kě)以理(lǐ)解為(wèi)一个二维矩阵;
矩阵的每个元素為(wèi)一个像素。
一个像素通常由三个颜色进行表达,例如用(yòng)RGB颜色空间表示时,每一个像素由三个颜色分(fēn)量组成。每一个颜色分(fēn)量用(yòng)1个字节来表达,其取值范围就是0~255。编码中(zhōng)常用(yòng)的YUV格式与之类似,这里不作(zuò)展开。
以1280x720@60fps的视频序列為(wèi)例,十秒(miǎo)钟的视频有(yǒu):1280*720*3*60*10 = 1.6GB。
如此大量的数据,无论是存储还是传输,都面临巨大的挑战。视频压缩或者编码的目的,也是為(wèi)了保证视频质(zhì)量的前提下,将视频减小(xiǎo),以利于传输和存储。同时,為(wèi)了能(néng)正确还原视频,需要将其解码。
PS:限于篇幅,视频编解码方面的技(jì )术原理(lǐ)就不在此展开,有(yǒu)兴趣强烈推荐从这篇深入學(xué)习:《即时通讯音视频开发(十九):零基础,史上最通俗视频编码技(jì )术入门》。
总之,视频编解码技(jì )术的主要作(zuò)用(yòng)就是:在可(kě)用(yòng)的计算资源内,追求尽可(kě)能(néng)高的视频重建质(zhì)量和尽可(kě)能(néng)高的压缩比,以达到带宽和存储容量的要求。
為(wèi)何突出“重建质(zhì)量”?
因為(wèi)视频编码是个有(yǒu)损的过程,用(yòng)户只能(néng)从收到的视频流中(zhōng)解析出“重建”画面,它与原始的画面已经不同,例如观看低质(zhì)量视频时经常会碰到的“块”效应。
如何在一定的带宽占用(yòng)下,尽可(kě)能(néng)地保持视频的质(zhì)量,或者在保持质(zhì)量情况下,尽可(kě)能(néng)地减少带宽利用(yòng)率,是视频编码的基本目标。
用(yòng)专业术语来说,即视频编解码标准的“率失真”性能(néng):
(1)“率”是指码率或者带宽占用(yòng);
(2)“失真”是用(yòng)来描述重建视频的质(zhì)量。
与编码相对应的是解码或者解压缩过程,是将接收到的或者已经存储在介质(zhì)上的压缩码流重建成视频信号,然后在各种设备上进行显示。
视频编解码标准,通常只定义上述的解码过程。
例如 H.264 / AVC 标准,它定义了什么是符合标准的视频流,对每一个比特的顺序和意义都进行了严格地定义,对如何使用(yòng)每个比特或者几个比特表达的信息也有(yǒu)精(jīng)确的定义。
正是这样的严格和精(jīng)确,保证了不同厂商(shāng)的视频相关服務(wù),可(kě)以很(hěn)方便地兼容在一起,例如用(yòng) iPhone、Android Phone 或者 windows PC 都可(kě)以观看同一在線(xiàn)视频网站的同一视频。
世界上有(yǒu)多(duō)个组织进行视频编码标准的制定工(gōng)作(zuò),國(guó)际标准组织 ISO 的 MPEG 小(xiǎo)组、國(guó)际電(diàn)信联盟 ITU-T 的 VCEG 小(xiǎo)组、中(zhōng)國(guó)的 AVS 工(gōng)作(zuò)组、Google 及各大厂商(shāng)组成的开放媒體(tǐ)联盟等。
视频编码标准及发展历史:
自 VCEG 制定 H.120标准开始,视频编码技(jì )术不断发展,先后成功地制定了一系列满足不同应用(yòng)场景的视频编码标准。VCEG 组织先后制定了H.120、H.261、H.262(MPEG-2 Part 2)、H.263、H.263+、H.263++。
MPEG也先后制定了MPEG-1、MPEG-2、MPEG-4 Part 2。以及两个國(guó)际组织合作(zuò)制定的H.264/AVC、H.265/HEVC、H.266/VVC。
中(zhōng)國(guó)自主知识产(chǎn)权的 AVS、AVS2、AVS3 视频编码标准;Google 制定的 VP8、VP9。
Google、思科(kē)、微软、苹果等公(gōng)司组成的开放媒體(tǐ)联盟(AOM)制定的 AV1。
这里特别提一下H.264/AVC:H.264/AVC虽有(yǒu)近20年历史,但它优秀的压缩性能(néng)、适当的运算复杂度、优秀的开源社區(qū)支持、友好的专利政策、强大的生态圈等多(duō)个方面的因素,依旧让它保持着强大的生命力,特别是在实时通信领域。像 ZOOM、思科(kē) Webex 等视频会议产(chǎn)品和基于 WebRTC SDK 的视频服務(wù),大多(duō)数主流场景都采用(yòng) H.264/AVC。
有(yǒu)关视频编解码标准,这里就不深入展开。更多(duō)详细资料,可(kě)以读一下下面这些精(jīng)选文(wén)章:
《即时通讯音视频开发(五):认识主流视频编码技(jì )术H.264》
《即时通讯音视频开发(十三):实时视频编码H.264的特点与优势》
《即时通讯音视频开发(十七):视频编码H.264、VP8的前世今生》
《爱奇艺技(jì )术分(fēn)享:轻松诙谐,讲解视频编解码技(jì )术的过去、现在和将来》
纵观视频编解码标准历史,每一代视频标准都在率失真性能(néng)上有(yǒu)着显著的提升,他(tā)们都有(yǒu)一个核心的框架,就是基于块的混合编码框架(如下图所示)。它是由J. R. Jain 和A. K. Jain在1979年的國(guó)际图像编码學(xué)会(PCS 1979)上提出了基于块运动补偿和变换编码的混合编码框架。
我们一起来对该框架进行拆解和分(fēn)析。
从摄像头采集到的一帧视频:通常是 YUV 格式的原始数据,我们将它划分(fēn)成多(duō)个方形的像素块依次进行处理(lǐ)(例如 H.264/AVC 中(zhōng)以16x16像素為(wèi)基本单元),进行帧内/帧间预测、正变换、量化、反量化、反变换、环路滤波、熵编码,最后得到视频码流。从视频第一帧的第一个块开始进行空间预测,因当前正在进行编码处理(lǐ)的图像块和其周围的图像块有(yǒu)相似性,我们可(kě)以用(yòng)周围的像素来预测当前的像素。我们将原始像素减去预测像素得到预测残差,再将预测残差进行变换、量化,得到变换系数,然后将其进行熵编码后得到视频码流。
接下来:為(wèi)了可(kě)以使后续的图像块可(kě)以使用(yòng)已经编码过的块进行预测,我们还要对变换系统进行反量化、反变换,得到重建残差,再与预测值进行求合,得到重建图像。最后我们对重建图像进行环路滤波、去除块效应等,这样得到的重建图像,就可(kě)以用(yòng)来对后续图像块进行预测了。按照以上步骤,我们依次对后续图像块进行处理(lǐ)。
对于视频而言:视频帧与帧的间隔大约只有(yǒu)十到几十毫秒(miǎo),通常拍摄的内容不会发生剧烈变化,它们之间存在非常强的相关性。
如下图所示,将视频图像分(fēn)割成块,在时间相邻的图像之间进行匹配,然后将匹配之后的残差部分(fēn)进行编码,这样可(kě)以较好地去除视频信号中(zhōng)的视频帧与帧之间的冗余,达到视频压缩的目的。这就是运动补偿技(jì )术,直到今天它仍然是视频编解码的核心技(jì )术之一。
运动估计和运动补偿:
变换编码的核心思想:是把视频数据分(fēn)割成块,利用(yòng)正交变换将数据的能(néng)量集中(zhōng)到较少几个变换系数上。结合量化和熵编码,我们可(kě)以获得更有(yǒu)效的压缩。视频编码中(zhōng)信息的损失和压缩比的获得,很(hěn)大程度上来源于量化模块,就是将源信号中(zhōng)的单一样本映射到某一固定值,形成多(duō)到少的映射,从而达到压缩的目的,当然在压缩的过程中(zhōng)就引入了损失。量化后的信号再进行无损的熵编码,消除信号中(zhōng)的统计冗余。熵编码的研究最早可(kě)以追溯到 20 世纪 50 年代,经过几十年的发展,熵编码在视频编码中(zhōng)的应用(yòng)更加成熟、更加精(jīng)巧,充分(fēn)利用(yòng)视频数据中(zhōng)的上下文(wén)信息,将概率模型估计得更加准确,从而提高了熵编码的效率。例如H.264/AVC中(zhōng)的Cavlc(基于上下文(wén)的变長(cháng)编码)、Cabac(基于上下文(wén)的二进制算术编码)。算术编码技(jì )术在后续的视频编码标准,如AV1、HEVC/H.265、VVC/H.266 中(zhōng)也有(yǒu)应用(yòng)。
视频编码发展至今,VVC/H.266 作(zuò)為(wèi)最新(xīn)制定的标准,采纳了一系列先进的技(jì )术,对混合编码框架的各个部分(fēn)都进行了优化和改进,使得其率失真性能(néng)相比前一代标准,又(yòu)提高了一倍。
例如:VVC/H.266 采用(yòng)了128x128大小(xiǎo)的基本编码单元,并且可(kě)以继续进行四叉树划分(fēn),支持对一个划分(fēn)进行二分(fēn)、三分(fēn);色度分(fēn)量独立于亮度分(fēn)量,支持单独进行划分(fēn);更多(duō)更精(jīng)细的帧内预测方向、帧间预测模式;支持多(duō)种尺寸和形式的变换、环内滤波等。
VVC/H.266 的制定,目标是对多(duō)种视频内容有(yǒu)更好支持,例如屏幕共享内容、游戏、动漫、虚拟现实内容(VR、AR)等。其中(zhōng)也有(yǒu)特定的技(jì )术被采纳进标准,例如调色板模式、帧内运动补偿、仿射变换、跳过变换、自适应颜色变换等。
回到本文(wén)的正题,接下来的内容,我们着重介绍视频编解码中(zhōng)的预测技(jì )术。
视频数据被划分(fēn)成方块之后,相邻的方块的像素,以及方块内的像素,颜色往往是逐渐变化的,他(tā)们之间有(yǒu)比较强的有(yǒu)相似性。这种相似性,就是空间冗余。既然存在冗余,就可(kě)以用(yòng)更少的数据量来表达这样的特征。
比如:先传输第一个像素的值,再传输第二个像素相对于第一个像素的变化值,这个变化值往往取值范围变小(xiǎo)了许多(duō),原来要8个bit来表达的像素值,可(kě)能(néng)只需要少于8个bit就足够了。
同样的道理(lǐ),以像素块為(wèi)基本单位,也可(kě)以进行类似的“差分(fēn)”操作(zuò)。我们从示例图中(zhōng),来更加直观地感受一下这样的相似性。
如上图中(zhōng)所标出的两个8x8的块:其亮度分(fēn)量(Y)沿着“左上到右下”的方向,具(jù)有(yǒu)连续性,变化不大。
假如:我们设计某种特定的“模式”,使其利用(yòng)左边的块来“预测”右边的块,那么“原始像素”减去“预测像素”就可(kě)以减少传输所需要的数据量,同时将该“模式”写入最终的码流,解码器便可(kě)以利用(yòng)左侧的块来“重建”右侧的块。
极端一点讲:假如左侧的块的像素值经过一定的运算可(kě)以完全和右侧的块相同,那么编码器只要用(yòng)一个“模式”的代价,传输右侧的块。
当然,视频中(zhōng)的纹理(lǐ)多(duō)种多(duō)样,单一的模式很(hěn)难对所有(yǒu)的纹理(lǐ)都适用(yòng),因此标准中(zhōng)也设计了多(duō)种多(duō)样的帧内预测模式,以充分(fēn)利用(yòng)像素间的相关性,达到压缩的目的。
例如下图所示的H.264中(zhōng)9种帧内预测方向:以模式0(竖直预测)為(wèi)例,上方块的每个像素值(重建)各复制一列,得到帧内预测值。其它各种模式也采用(yòng)类似的方法,不过,生成预测值的方式稍有(yǒu)不同。有(yǒu)这么多(duō)的模式,就产(chǎn)生了一个问题,对于一个块而言,我们应该采用(yòng)哪种模式来进行编码呢(ne)?最佳的选择方式,就是遍历所有(yǒu)的模式进行尝试,计算其编码的所需的比特数和产(chǎn)生的质(zhì)量损失,即率失真优化,这样明显非常复杂,因而也有(yǒu)很(hěn)多(duō)种其它的方式来推断哪种模式更好,例如基于SATD或者边缘检测等。
从H.264的9种预测模式,到AV1的56种帧内方向预测模式,越来越多(duō)的模式也是為(wèi)了更加精(jīng)准地预测未编码的块,但是模式的增加,一方面增加了传输模式的码率开销,另一方面,从如此重多(duō)的模式中(zhōng)选一个最优的模式来编码,使其能(néng)达到更高的压缩比,这对编码器的设计和实现也提出了更高的要求。