前言
随着 5G 的成熟和宽泛商用,带宽曾经越来越高,传输视频变得更加容易。设施特地是挪动设施算力的晋升、存储容量的晋升,使得视频技术的利用越来越宽泛,无论是流媒体、泛娱乐、实时通信,视频都带给了用户更加丰盛的体验。
视频相干的技术,特地是视频压缩,因其专业性,深刻开发的门槛较高。具体到视频实时通信场景,视频压缩技术面临更严厉的挑战,因为实时通信场景下,对时延要求十分高,对设施适配的要求也十分高,对带宽适应的要求也十分高,开发一款满足实时通信要求的编解码器,难度也很高。之前的文章中,咱们曾经在《深入浅出了解视频编解码技术》一文中简要介绍了视频编解码根本框架,明天咱们将深刻分析其中的预测模块,便于大家更好地了解视频编解码技术。
01
色彩空间
开始进入主题之前,先简略看一下视频是如何在计算机中进行表白的。视频是由一系列图片依照工夫顺序排列而成,每一张图片为一帧。每一帧能够了解为一个二维矩阵,矩阵的每个元素为一个像素。一个像素通常由三个色彩进行表白,例如用 RGB 色彩空间示意时,每一个像素由三个色彩重量组成。每一个色彩重量用 1 个字节来表白,其取值范畴就是 0~255。编码中罕用的 YUV 格局与之相似,这里不作开展。
图一
以 1280×720@60fps 的视频序列为例,十秒钟的视频有 128072036010 = 1.6GB,如此大量的数据,无论是存储还是传输,都面临微小的挑战。视频压缩或者编码的目标,也是为了保障视频品质的前提下,将视频减小,以利于传输和存储。同时,为了能正确还原视频,须要将其解码。从最早的 H.261 开始,视频编解码的框架都采纳了这一构造,如图所示。次要的模块分为帧内 / 帧间预测、(反)变换、(反)量化、熵编码、环内滤波。一帧视频数据,首先被宰割成一系列的方块,依照从左到右从上到下的形式,一一进行解决,最初失去码流。
图二
02
帧内预测
视频数据被划分成方块之后,相邻的方块的像素,以及方块内的像素,色彩往往是逐步变动的,他们之间有比拟强的有相似性。这种相似性,就是空间冗余。既然存在冗余,就能够用更少的数据量来表白这样的特色。比方,先传输第一个像素的值,再传输第二个像素绝对于第一个像素的变动值,这个变动值往往取值范畴变小了许多,原来要 8 个 bit 来表白的像素值,可能只须要少于 8 个 bit 就足够了。同样的情理,以像素块为根本单位,也能够进行相似的“差分”操作。咱们从示例图中,来更加直观地感受一下这样的相似性。
图三
如图中所标出的两个 8 ×8 的块,其亮度重量(Y)沿着“左上到右下”的方向,具备连续性,变动不大。如果咱们设计某种特定的“模式”,使其利用右边的块来“预测”左边的块,那么“原始像素”减去“预测像素”就能够缩小传输所须要的数据量,同时将该“模式”写入最终的码流,解码器便能够利用左侧的块来“重建”右侧的块。极其一点讲,如果左侧的块的像素值通过肯定的运算能够齐全和右侧的块雷同,那么编码器只有用一个“模式”的代价,传输右侧的块。当然,视频中的纹理多种多样,繁多的模式很难对所有的纹理都实用,因而规范中也设计了多种多样的帧内预测模式,以充分利用像素间的相关性,达到压缩的目标。例如下图 (From Vcodex)所示的 H.264 中 9 种帧内预测方向。以模式 0(竖直预测)为例,上方块的每个像素值(重建)各复制一列,失去帧内预测值。其它各种模式也采纳相似的办法,不过,生成预测值的形式稍有不同。有这么多的模式,就产生了一个问题,对于一个块而言,咱们应该采纳哪种模式来进行编码呢?最佳的抉择形式,就是遍历所有的模式进行尝试,计算其编码的所需的比特数和产生的品质损失,即率失真优化,这样显著非常复杂,因此也有很多种其它的形式来推断哪种模式更好,例如基于 SATD 或者边缘检测等。
从 H.264 的 9 种预测模式,到 AV1 的 56 种帧内方向预测模式,越来越多的模式也是为了更加精准地预测未编码的块,然而模式的减少,一方面减少了传输模式的码率开销,另一方面,从如此重多的模式当选一个最优的模式来编码,使其能达到更高的压缩比,这对编码器的设计和实现也提出了更高的要求。
图四
03
帧间预测
以下 5 张图片是一段视频的前 5 帧,能够看出,图片中只有 Mario 和砖块在静止,其余的场景大多是类似的,这种相似性就称之为工夫冗余。编码的时候,咱们先将第一帧图片通过前文所述的帧内预测形式进行编码传输,再将后续帧的 Mario、砖块的静止方向进行传输,解码的时候,就能够将静止信息和第一帧一起来合成后续的帧,这样就大大减少了传输所需的 bit 数。这种利用工夫冗余来进行压缩的技术,就是静止弥补技术。该技术早在 H.261 规范中,就曾经被采纳。
图五
细心地读者可能曾经发现,Mario 和砖块这样的物体怎么形容,能力让它仅凭静止信息就能残缺地出现进去?其实视频编码中并不需要晓得静止的物体的形态,而是将整帧图像划分成像素块,每个像素块应用一个静止信息。即基于块的静止弥补。下图中红色圈出的红色箭头即编码砖块和 Mario 时的静止信息,它们都指向了前一帧中所在的地位。Mario 和砖块都有两个箭头,阐明它们都被划分在了两个块中,每一个块都有独自的静止信息。这些静止信息就是静止矢量。静止矢量有程度和竖直两个重量,代表是的一个块绝对于其参考帧的地位变动。参考帧就是曾经编码过的某一(多)个帧。
图六
当然,传输静止矢量自身就要占用很多 bit,为了进步静止矢量的传输效率,一方面,能够尽可能得将块划分变大,共用一个静止矢量,因为平坦区域或者较大的物体,他们的静止可能是比拟统一的,从 H.264 开始,可变块大小的静止弥补技术被宽泛采纳;另一方面,相邻的块之间的静止往往也有比拟高的相似性,其静止矢量也有较高的相似性,静止矢量自身也能够依据相邻的块静止矢量来进行预测,即静止矢量预测技术;最初,静止矢量在表白物体静止的时候,有精度的取舍。像素是离散化的表白,事实中物体的静止显然不是以像素为单位进行静止的,为了准确地表白物体的静止,须要抉择适合的精度来定义静止矢量。各视频编解码规范都定义了静止矢量的精度,静止矢量精度越高,越能准确地表白静止,然而代价就是传输静止矢量须要破费更多的 bit。H.261 中静止矢量是以整像素为精度的,H.264 中静止矢量是以四分之一像素为精度的,AV1 中还减少了八分之一精度。个别状况,工夫上越近的帧,它们之间的相似性越高,也有例外,例如往复运动的场景等,可能相隔几帧,甚至更远的帧,会有更高的类似度。为了充分利用曾经编码过的帧来进步静止弥补的准确度,从 H.264 开始引入了多参考帧技术,即,一个块能够从曾经编码过的很多个参考帧中进行静止匹配,将匹配的帧索引和静止矢量信息都进行传输。
那么如何失去一个块的静止信息呢?最奢侈的想法就是,将一个块,在其参考帧中,一一地位进行匹配查看,匹配度最高的,就是最终的静止矢量。匹配度,罕用的有 SAD(Sum of Absolute Difference)、SSD(Sum of Squared Difference)等。一一地位进行匹配度查看,即常说的全搜寻静止预计,其计算复杂度可想而知是十分高的。为了放慢静止预计,咱们能够缩小搜寻的地位数,相似的有很多算法,罕用的如钻石搜寻、六边形搜寻、非对称十字型多层次六边形格点搜索算法等。以钻石搜寻为例,如图所示,以起始的蓝色点为核心的 9 个匹配地位,别离计算这 9 个地位的 SAD,如果 SAD 最小的是核心地位,下一步搜寻中心点更近的四周 4 个绿色点的 SAD,抉择其中 SAD 最小的地位,持续放大范畴进行搜寻;如果第一步中 SAD 最小的点不在核心,那么以该地位为核心,减少褐色的 5 或者 3 个点,持续计算 SAD,如此迭代,直到找到最佳匹配地位。
图七
编码器在实现时,可依据理论的利用场景,对搜索算法进行抉择。例如,在实时通信场景下,计算复杂度是绝对无限的,静止预计模块要抉择计算量较小的算法,以均衡复杂度和编码效率。当然,静止预计与静止弥补的复杂度还与块的大小,参考帧的个数,亚像素的计算等无关,在此不再深刻开展。
04
总结
本文介绍的预测技术,充分利用了视频信号空间上和工夫上的相关性,通过多种设计精美的预测模式,达到了去除冗余的目标,这是视频压缩高达千倍比例的要害之一。纵观视频编解码技术的倒退历史,预测模式越来越多,预测的精确度越来越高,带来的压缩比也越来越高。如何疾速高效地应用这些预测模式,也必然成为设计实现的重中之重,成为 H.265/H.266/AV1 这些新规范施展其高效压缩性能的要害。关注拍乐云 Pano,咱们将在前面的文章中为大家分享《视频编解码系列》的更多技术干货。
图片出处:
图一:
https://github.com/leandromor…
图四:
H.264/AVC Intra Prediction