白话H.265/HEVC和H.264/AVC编码结构

简介: 写在前面在信息化时代,视频技术和应用的发展,特别是高清(HD)、超高清(UHD)、多视点(MultiView)视频、VR/AR技术的兴起,海量的视频信息已如潮涌般深入到我们工作和生活的方方面面。随着5G通信技术逐渐铺开落地,移动端设备的传输数据量会进一步增加。

写在前面

在信息化时代,视频技术和应用的发展,特别是高清(HD)、超高清(UHD)、多视点(MultiView)视频、VR/AR技术的兴起,海量的视频信息已如潮涌般深入到我们工作和生活的方方面面。
随着5G通信技术逐渐铺开落地,移动端设备的传输数据量会进一步增加。在整个移动数据中,视频数据占比也是迅猛增加;有预测表明,在未来的3到4年,视频数据占比会从目前的60%增加到80%左右。
_1

如何在视频数据爆炸的时代更有效率地传输视频数据至关重要,也使得大家越来越关注各种视频压缩协议。

编码器历史

视频压缩限于数字视频范畴,实际从上世纪80年代末就已经开始逐步有各种标准推出、迭代。
早期的编码标准有两条主线,ITU(International Telecommunications Union)和MPEG(Moving Picture Experts Group)。
_2

Google于2009年收购On2 Technologies之后,也加入了视频编码标准的团战,推出VP9之后,AV1目前标准也已完成制定。

ITU在1988年推出了h.261编码标准。虽然主要目标是用于视频会议和可视电话等高实时性、低码率的视频图像传输场合,但可谓是视频压缩编码发展的第一个里程碑。因为h.261提出的空间压缩加时间压缩的混合编码模式沿用至今,信源编码所采用的技术也基本确定了现代编码器的框架,主要包括:

  1. 帧内编码/帧间编码判定
  2. 帧内编码
  3. 帧间编码/运动估计
  4. 环路滤波器

MPEG-1标准于1993年8月公布,广泛用于VCD和MP3。
该标准包括五个部分:
第一部分说明了如何对音频和视频进行复合编码。
第二部分视频协议
第三部分音频协议
第四部分说明了检验解码器或编码器的输出比特流符合前三部分规定的过程
第五部分是一个用完整的C语言实现的编码和解码器。

H.264是由ISO/IEC与ITU-T组成的联合视频组(JVT)制定的新一代视频压缩编码标准。在ISO/IEC中该标准命名为AVC (Advanced Video Coding),作为MPEG-4标准的第10个选项;在ITU-T中正式命名为H.264标准。
得益于H.264低廉的专利费用,它是目前应用最广泛的压缩标准之一。在使用了十几年之后,随着视频分辨率、帧率的逐渐增加,h.264标准所带来的压缩率偏低的问题也逐渐显现。所以推出了H.265标准。

H.265是ITU-T VCEG 继H.264之后所制定的新的视频编码标准。H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进。HEVC的技术特点和优势集中表现在以下三个方面

  1. HEVC的核心目标:在H.264/AVCHP(HighProfile)的基础上,在保证相同视频质量的前提下,视频流的码率减少50%。在提高压缩效率的同时,允许编码端适当提高复杂度(3倍以下计算复杂度)。
  2. HEVC的编码框架:沿用H.264/AVC的混合编码框架,用帧间和帧内预测编码来消除时间域和空间域的冗余度,对残差进行变换编码来消除变换域的冗余度,用熵编码来消除统计域的冗余度。在混合编码框架内,设计了多种新的编码工具或技术,提高了视频压缩效率。
  3. HEVC的技术创新:灵活的图像四叉树(Quadtree)结构和条、片划分技术,多角度帧内预测技术,运动信息融合技术,高精度运动补偿技术,自适应环路滤波技术,利于并行计算的波前技术以及基于上下文的算术编码技术。

在国内,H.264和H.265是目前使用最广泛的编码协议。下面的章节,我们来调研一下H.264/AVC和H.265/HEVC在结构和实现细节的特点和差异。

编码器结构

_3

目前所有的编码器都是采用混合编码的结构,即预测编码和变换编码的混合。
预测编码是指利用相邻像素的空间或时间相关性,用已传输的像素对当前正在编码的像素进行预测,然后对预测值与真实值的差-预测误差进行编码和传输,即我们常说的帧内预测,帧间预测。
变换编码是指将空间域描述的图像,经过某种变换(如离散余弦变换、离散正弦变换、哈达玛变换等)形成变换域中的数据(系数),达到改变数据分布,减少有效数据量的目的。

总结来说,一个编码器基本上都会有帧内预测、帧间预测、变换量化、熵编码以及滤波等几个部分。H.264和H.265都是如此。

帧内预测

帧内预测是一种较为简单和实用的图像压缩编码方法。预测压缩编码后传输的并不是像素值本身,而是编码像素的预测值和真实值之差,即预测误差或残差。
为什么用像素的预测误差作为压缩的结果或传输的对象?这是因为大量统计结果表明,同一幅图像的邻近像素之间有着很强的相关性,或者说这些像素值很相近,邻近像素值之间发生突变的概率很小。这样,编码像素的预测值往往和它的真实的像素值相差无几,预测误差很多为0或很小,我们就可以用较少的比特来表示和传输。

在H.264/AVC的帧内预测编码中,对当前块的预测是基于邻近已编码重建的块进行的。对亮度像素而言,独立进行预测的块可以是16×16宏块或4×4子块。4×4的亮度子块有9种可选的预测模式,适于对具有大量细节的图像进行预测;16×16的亮度块有4种预测模式,适于对具有平坦区域的图像进行预测。和16×16亮度宏块对应的色度块尺寸为8×8,也有4种预测模式,类似于16×16亮度块预测模式。一个子块或宏块将面临多种预测模式的选择,不同的模式选择将产生不同的压缩率,最佳模式选择由此而成为帧内预测编码中的一个重要问题。选择最佳预测模式的方法有很多种,其中率失真优化(RDO)方法是一种性能良好的选择方法,其原则是选择能获得最准确预测、产生码字最少的那种预测模式。

以4x4块预测为例,如下图所示,预测操作实际上就是建立待预测像素值a~p和预测参考像素值A~M之间的关系。

_4

下图给出了4×4亮度块帧内预测9种模式中编码像素和预测像素之间的关系,用虚线箭头根部的参考像素(1个或多个)的加权值来预测箭头经过的待编码像素的预测值。

_5

HEVC的帧内预测技术和H.264/AVC类似,采用基于块的多方向帧内预测方式来消除图像的空间相关性,但比H.264/AVC预测方向更细、更灵活。HEVC预测块的预测参考像素也和H.264/AVC类似,来自预测块左方的一列和上方的一行已编码的像素。HEVC为亮度预测块定义了33种不同的帧内预测方向,连同平面和直流模式,总共35种帧内预测模式。
_6

帧内亮度预测单元的尺寸从4×4到32×32,对于所有尺寸的预测单元,一律采用所有的35种模式。在使用重构参考像素预测当前块时,对于各种尺寸的预测块均采用1/32插值精度,对应32个像素标注格,而不随预测尺寸大小不同而采用的插值精度不同。
HEVC帧内预测的过程大致可分为三步:参考像素的填充,参考像素的平滑滤波,利用参考像素值求出预测块像素的预测值。

帧间预测

一般而言,帧间预测编码编码效率比帧内预测更高,其原因在于视频的帧间相关性很强,信息的冗余度很高。统计结果表明,对内容变化剧烈的256级灰度视频序列,帧间差绝对值超过6的像素平均不到一帧像素的7.5%;内容变化不剧烈的相邻帧,相差更少。
去除帧间相关性的有效方法就是帧间预测。我们先来看两帧之间的预测。
_7

把当前帧ft(x,y)与帧存储器输出的前一重建帧ft-1(x,y)(也称参考帧)同时输入运动估计模块,经搜索、比较后得到运动矢量(MV)。将此运动矢量输入到运动补偿模块,“补偿”输入的重建参考帧,得到当前编码帧ft(x,y)的预测帧^ft-1(x,y)。预测帧和当前帧ft(x,y)之差即为帧间预测误差rt(x,y)。除了预测误差之外,运动矢量也要传到解码端。解码器利用反量化、反变换后的预测误差和经运动补偿后的重建帧相加就可近似得到当前重建帧。预测帧并不需要传给解码器,因为解码器可以用和编码器相同的方法得到预测帧。

为了提高帧间预测的精度,往往使用双向帧预测,即参考帧既有将来帧,也有过去帧。利用前向和后向预测系数,确定最终的预测帧。
ft(x,y)=aft-1(x+i, y+j) + bft+1(x+k, y+j)

粗略的说,H.264和H.265都采用类似上述的预测方式。那么区别在哪里呢?

一是H.265采用了灵活的预测块(PU)划分,有利于使划分结果更加贴近运动物体的形状

如果对每一个像素都去计算运动向量,那么精度肯定是最高的;但是带来的问题将是巨大的运算量和数量很多的运动向量需要传输。所以,一般都以像素块为单位来计算运动矢量,这就是宏块。
_8

在H.264协议中每个16×16的宏块可以进一步分割为更小的块,有3种方式分割:两个16×8的块,两个8×16子块,四个8×8块。其中,8×8的宏块分割又称子宏块(subMB),它还可以进一步分割,有3种方式分割:两个4×8块,两个8×4块,4个4×4块。
H.265的块划分更复杂。对应H.264的宏块概念,H.265有CTU(coding tree unit),每个CTU都可以递归地分解为更小的方形CU。CU是CTU四叉树分解最末的叶节点,视频编码的帧间预测算法就在CU上实行。
如下图所示,CTU的尺寸为64×64,一共有4层划分,形成22个CB,编码处理的顺序服从划分层次(深度)优先的光栅扫描规则,编号从0到21。其中0号是最大的CU,32×32,此外还有16×16的CU,如1、2号等,最小的CU为8×8,如3、4号等。
_9

编码块(CU)还可以进一步划分为一个或多个预测单块(PU)和变换块(TU),同一个CU可以同时进行两种划分,一种是预测块的划分,另一种是变换块的划分。这两种划分都在这个CU的几何位置中进行,但两者基本上是互不相干,而且划分的方法也不同,尽管划分的结果还是在同一个CU中。CU到PU最多允许一层划分,可以是1分2,也可以是1分4,还允许不对称的1分2。

二是采用了更合理的子像素插值算法,进一步提高了运动估计和运动补偿的精度

在H.264/AVC中,亮度MV的精度为1/4整亮度像素间隔,由于亮度和色度像素样点的几何比例,色度MV的精度为1/8整色度像素精度。
H.265的像素精度和H.264一致。但是内插的方式更为合理,当然,也更为复杂。
H.264/AVC对于亮度分数样点的内插采用2步内插处理:第一步使用一个6抽头滤波器,滤波后进行舍入操作得到半像素点插值;第二步对1/4样点两端的整数点值和半像素点值进行平均处理,得到1/4像素位置的插值。与H.264/AVC不同,HEVC中亮度分数样点的内插分两种情况处理,对1/2像素位置插值使用一个8抽头滤波器,对1/4像素位置插值使用一个7抽头滤波器。
可见,HEVC是使用这种可分离的内插滤波器来产生所有分数位置样点,没有中间的舍入操作,可提高精度,简化分数样点内插过程。同时,HEVC使用了更长的滤波器提高了内插精度。
_10

三是采用了新的合并模式,可以更加高效地编码传输运动参数。

为了提高编码效率,运动矢量等参数也会被压缩编码,其中预测编码是最常用的一种方法,它的原理和图像像素的预测编码类似,其根据也是相邻运动矢量之间存在的较大相关性。H.265在运动矢量编码传输上更为高效。
下图描述了由统计平均得到的当前块和相邻块(时域、空域)的运动矢量之间的相关系数。右边为当前帧,深色的为当前块;图左边为先前帧,中心块为同位块(和当前帧中当前块处于相同的空间位置)。块中标明的数字是当前块和其邻近块的运动矢量在水平和垂直方向的平均相关系数。可以看到,当前块和邻近块的运动信息之间存在着较强的相关性,这是HEVC中采用运动信息预测的根据,即相邻块的运动信息很可能相同或相近。
_11

HEVC对运动参数(主要是运动矢量)的编码继承并改进了H.264/AVC的方法,设有三种模式,简称为Inter模式、Skip模式和Merge模式。前两种模式和H.264/AVC类似,其中Inter模式也常称为高级运动矢量预测(AdvancedMotionVectorPrediction,AMVP)模式。Merge模式是HEVC新引入的一种“运动合并”技术。
在以往标准的帧间预测中,要为每个帧间预测宏块都传输一套运动参数。为进一步提高编码效率,可对相邻己编码的帧间预测块(PU)进行合并处理,形成Merge帧间预测编码模式,将邻近的运动参数相同或相近的若干PU合并起来形成一个形状不规则的“小区”,可克服四叉树分割中固定的方块划分的缺点,且只要为每个小区传输一次运动参数,不必为每个PU分别传输运动参数。这就是HEVC的运动合并模式,是一种利用时空相邻的已编码预测单元(PU)的运动参数得到当前预测单元运动参数的技术。

变换和量化

变换及量化设计大量计算公式,这里不展开。
HEVC的变换和量化大体上和H.264/AVC相似,但增加了多处改进,提高了编码效率。在变换方面的改进主要体现在三方面,
一是变换块(TB)的尺寸可变范围扩大,
二是整数DCT的精度提高,
三是引进了4×4的离散正弦变换
在量化方面基本和H.264/AVC相同,但由于HEVC的整数DCT的缩放矩阵特别简单,从而使得量化处理的负担有所减轻。

熵编码

H.264/AVC为了改善以往标准中熵编码存在的编码效率低、重建效果差等不足,同时考虑到当时实现的复杂性,设计了两种可选用的熵编码的方法,即效率稍低、实现较易的基于上下文的自适应可变长编码(CAVLC)和编码效率较高、实现较难的基于上下文的自适应二进制算术编码(CABAC)。在编码性能方面,CABAC和CAVLC相比大致类似于算术编码和Huffman编码相比。据统计,CABAC能在各种不同码率情况下,较CAVLC节省5%~10%的码率。但在提高编码效率的同时,CABAC要比CAVLC多20%~30%的运算量,这也是CABAC付出的代价。

HEVC基本上是沿用了H.264/AVC的CABAC方法,改变的地方并不多。与H.264/AVC其他编码工具相比较,CABAC是HEVC中改动相对较少的一个部分。

环路滤波

视频压缩编码是一种有损压缩方式,编码中的量化和计算误差会给重建图像带来不可恢复的失真。解码重建图像的失真有多方面的表现,如方块效应(Blocking Artifacts)、亮度的失真(亮度变化)、彩色的漂移(色彩发生偏差、变色)等。其中方块效应是基于块的图像压缩方法中最明显一类可视缺陷,因此早在H.263、MPEG2标准中,后来在H.264/AVC标准中,以及目前在HEVC中都采用了适当滤波的方法来消除方块效应,使解码重建图像的主观质量和客观质量都有较大提高,同时也提高了编码效率。

方块效应的产生的原因是多方面的,但主要来自以下两个方面。一是由变换、量化的误差引起的。在视频编码中,编码器基本上是逐块地对预测后的残差进行变换和量化,而量化过程是一个有损压缩的过程,因此在反换量化、反变换后重建的图像会出现误差,由于块之间的处理不一致,而且在方块边界处的误差格外大一些,造成在图像块边界上的视觉不连续。另一个原因来自帧间预测的运动补偿过程。运动补偿的预测数据通常来自同一帧的不同位置上的内插点,也有可能是不同帧不同位置的内插点,因此运动补偿块不会绝对匹配,从而也会产生误差,引起图像在复制的边界上的不连续现象。而编码过程中的预测参考帧通常都来自这些重建图像,这又导致了待预测图像失真。

为了消除或减轻块效应,我们可以用环路滤波(LoopFilter)的方法对重建图像进行滤波,降低重建误差。在环路滤波中,去方块滤波(DBF)是其中最重要的一类改善重建图像质量的方法。去方块滤波器的作用是通过“修正”重建块的像素值,尤其是边界附近的像素值,从而达到消除编解码算法带来的方块效应的目的。在H.264/AVC标准中就采用了去方块滤波的方法处理边界处的像素。

H264/AVC中采用了去方块滤波技术后,在相同的峰值信噪比(PSNR)下,即相同图像质量,可以节省的码率超过9%。但去方块滤波给编码器带来了计算复杂度的显著增加,主要原因是它具有高度的自适应性,需要对所有的4×4小方块的边界及样点值进行边界强度判断和自适应滤波处理。对4×4的方块边界两边的各2个点进行计算、判断和修正,几乎涉及重建图像中的每个像素点

根据去方块滤波的原理,去方块滤波在H.264/AVC编码器和解码器中是一致的,主要包括两个主要步骤,即对块边界强度的判定和对像素的滤波。

编码块的边界强度(BoundaryStrength,BS)决定去方块滤波器选择的滤波参数,并控制去方块效应的程度。对所有4×4亮度块的边界,边界强度的参数值在0~4。下表显示了BS与相邻图像块的模式及编码条件的关系。
_12

在实际滤波算法中,BS决定对边界的滤波强度。当BS值为4时,表示要用较强的滤波模式;当BS值为0时,表示不需要对边界进行滤波;当BS值为1~3时,表示可采用普通滤波模式。

HEVC的环路滤波比H.264/AVC增加了一项,包括去方块滤波(DeBlockingFilter,DBF)和样点自适应补偿(SampleAdaptiveOffset,SAO)两项。
_13

DBF与H.264/AVC的DBF作用类似,旨在减小图像编码过程中由于块分割而造成的块效应,计算难度相对于H.264有所简化。SAO则是HEVC新引入的对重建图像的误差补偿机制。

DBF仅用于位于块边界处的像素,而SAO滤波器自适应地用于满足某种条件的所有像素,如处于一定梯度结构中的像素。SAO的主要思想是对照原始图像,通过对重建图像块的像素特点进行合适的分类,对不同的分类施加不同的补偿值,使其更接近原图像,从而达到减少图像失真的效果。
由于预测、变换、量化等过程的影响,重建样点存在一些局部峰值、凸拐点、凹拐点以及局部谷点。如果能够对于局部峰点、凸拐点施加适当的负值补偿,对凹拐点、局部谷点施加适当的正值补偿,抵消图像编码失真的影响,将重建样点与原始样点值的差距缩小,就可以在一定程度上减小图像的失真。
如果把所有重建像素值和真实像素值的差值传递到远端,那么是最好的。但是带来的带宽是无法承受的。所以针对失真补偿采用折中的办法:将重建图像的局部特征结构分类,对不同的类赋予不同的补偿值以纠正编码带来的偏差,这样虽不能保证百分之百地覆盖和准确,但可在很大程度上补偿编码的差错,改进重建图像的质量
_14

将重建图像的局部特征结构分类,对不同的类赋予不同的补偿值以纠正编码带来的偏差,这样虽不能保证百分之百地覆盖和准确,但可在很大程度上补偿编码的差错,改进重建图像的质量,而且并没有增加编码比特数,甚至还可能有所减少。这就是SAO技术的基本出发点。

写在最后

随着视频数据爆发式增长,人们追求高画质、低带宽的目标是坚定的,从H.264到H.265到AV1 的标准迭代可见一斑。目前在国内的视频市场,在某些领域H.265客户端已经占比超过50%。
视频标准的迭代,带来画质提升,带宽降低的同时,计算量也会急剧上升。在这个大背景下,各个计算平台如何承接、融合各种场景、各种标准的编码需求值得大家一起探讨。
阿里云智能FaaS舜天平台基于FPGA的H.265编码器在画质、吞吐、成本上都有着不错表现,欢迎勾兑。

目录
相关文章
|
6月前
|
存储 编解码 缓存
H.264编码
H.264编码
67 0
|
存储 编解码 算法
H.264编码及AAC编码基础 1
H.264编码及AAC编码基础
140 0
|
存储 编解码 算法
H.264编码及AAC编码基础 3
H.264编码及AAC编码基础
256 0
|
存储 编解码 算法
H.264编码及AAC编码基础 2
H.264编码及AAC编码基础
108 0
|
编解码
【H.264/AVC视频编解码技术详解】十五、H.264的变换编码(二):H.264整数变换和量化的实现
《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.
2366 0
|
编解码 算法 索引
【H.264/AVC视频编解码技术详解】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据
《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.
1790 0
|
编解码
【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构
《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.
1653 0