本系列文章分为三个部分,首先对HEVC标准做一个介绍,然后回顾一下H.264中的码率控制方法,分析为什么不能直接沿用旧的方法,最后具体分析HEVC的码率控制方法和相应代码。
首先我们需要明白的是,其实每一代视频编码标准的更新都是为了实现两个大目标:更好的支持高分辨视频;以更高的压缩率达到同等的主观质量。除此之外,还有提高网络适配性(比如在H.264中定义的网络抽象层概念)、抗出错性能(H.264中的数据分割、灵活宏块顺序)等等的小目标。当然,提升这些性能要付出的代价往往是复杂度的大幅增加。在这几个问题上,HEVC也不例外。当年JCT-VC确定的HEVC的核心目标就是在H.264 High Profile的基础上将压缩效率提高一倍。分辨率方面HEVC也可以支持到8K。
从编码框架上来说,HEVC并没有革命性的改变,依旧采用了混合编码框架,也能看到在H.264中就有的变换、量化、熵编码、帧内预测、帧间预测、环路滤波等模块。但是HEVC在这个框架中几乎所有模块都引入了新的编码技术。一路看过各种编码标准之后就会发现,随着视频编码技术的不断成熟,各种新推出的编码标准基本都是这个模式:在保持原有框架基本不变的情况下采用更多的新技术。
上图即为一个典型的混合编码架构
下面我们就来具体看看HEVC中的一些新概念以及在H.264已有概念上的一些创新。
为了应对不同应用场合, HEVC设立了GOP的3种编码结构,即帧内编码、低延时编码和随机访问编码。在帧内编码结构中,每一帧图像都是按帧内方式进行空间域预测编码,不使用时间参考帧。在低时延( Low Delay)编码结构中,只有第一帧图像按照帧内方式进行编码,并成为 IDR帧,随后的各帧都作为一般的P帧和B帧进行编码。这主要是为交互式实时通信设计的。随机访问( Random Access) 编码结构主要由分级B帧构成( Hierarchical B) ,周期性地(大约每隔 1秒) 插入随机访问( Clean Random Access,CRA) 帧。这些CRA 帧成为编码视频流中的随机访问点( Random Access Point,RAP) 。所谓随机访问点是指对这些帧的解码可以独立进行,不需要参考比特流中前面已经解码的图像帧。这种对随机访问方式有力地支持了信道转换、 搜索以及动态流媒体服务等应用。
在HEVC中依然采用分块编码方式,但不同于H.264中固定尺寸的宏块,HEVC中块的尺寸是可以自适应改变的。HEVC中定义了四个新的概念:编码树单元、编码单元、预测单元和变换单元。
(1) 编码树单元
类似于H.264 /AVC中的宏块,HEVC将编码帧分为若干编码树块( Coding Tree Blocks,CTB),它们是进行预测、变换、量化和熵编码等处理的基本单元,其尺寸或者所包含的像素数可以是16×16、32×32或64×64。同一位置的亮度CTB和两块色度CTB,再加上相应的语法元素形成一编码树单元( Coding Tree Units,CTU)。一般来说,Unit是从语法结构角度进行描述,而Block是从采样值角度进行描述,并不特意区分这两个概念。由于目前HEVC只支持4:2:0的像素格式,所以色度块CTB的像素数为同等亮度块的1 /4,即水平和垂直方向都是亮度块的一半。
(2) 编码单元
CTU 又可以按照四叉树结构分解为若干方形编码单元( Coding Units,CU),同一层次的CU必须是同一尺寸的4个方块,最多可有4层分解,即64×64,32×32,16×16和8×8。如果不分解,则这个CTU仅包含一个 CU。每个CU包含一块亮度编码块( Coding Blocks,CB) 、两个色度CB以及相应的语法元素。CB 的大小和图像的特性是自适应的,在图像比较平缓区域,选择比较大的CB,而在图像边缘或纹理复杂的区域,选择比较小的CU,有利于提高编码效率。CU是决定进行帧内预测还是帧间预测的单元,也就是说整个 CU只能是一种预测模式,不是帧内就是帧间。CU还可以按照四杈树层次分解(或不分解) 为更小的预测单元( Prediction Units,PU) 和变换单元( TB,Transform Units) 。
(3) 预测单元
预测单元PU是进行预测运算的基本单元,包括帧内和帧间预测两类。一个编码单元CU可以包含一个或者多个预测单元,CU到PU仅允许一层划分,最小的PU为4×4。划分可以是对称的,也可以是不对称的。如图所示, 一个2N×2N ( N可以是 4、8、16、32) 的CU可划分为8种包含PU方式。帧间预测时可以在这 8 种方式中任意选择,在帧间预测的跳过( skip) 模式中只允许选择2N×2N这种模式,帧内预测时只允许选择2N×2N或N×N方式。
(4) 变换单元
变换单元TU是进行变换和量化的基本单元,是在CU的基础上划分的,但受到所在的预测单元PU的限制。如PU是正方形,则TU也必须是正方形,尺寸为4×4、8×8、16×16、32×32。帧内编码模式中变换单元的尺寸需小于或者等于预测单元,而帧间编码模式中变换单元可以大于预测单元,但是不能超过编码单元 CU。一个编码单元中多个变换单元也是按照四叉树的结构排列,即每向下一层划分为4个小的正方形。如 PU为非正方形时,TU 也需非正方形,其大小为32×8、8×32、16×4、4×16,可用于亮度分量,其中只有32×8、8×32 可用于色度分量。HEVC中允许使用的变换包括4x4、8x8、16x16和32x32整数DCT变换以及对于Intra预测中4x4亮度块使用的整数DST变换。
虽然Intra预测的模式信息是以PU为单位传递的,但Intra预测是以TU为单位进行的。所有PU内部的各个TU的预测方向是一致的,以TU为基本单元进行Intra预测的目的是使已重建像素和待预测像素之间的距离尽量短,进而提高预测效率,即进行帧内预测的基本单元是TB。这也是在Intra编码的CU中,TU永远不会比PU大的原因。
条( Slice)的划分在H.264 /AVC 中就有,HEVC也允许将图像帧划分为若干条,条是HEVC 中独立的编码区域,条的划分以CTU或更小的CU为界。为了支持并行计算和差错控制,某一个条可以划分为更小的条,谓之“熵条”( Entropy Slice,ES)。每个ES都可独立地进行熵解码,而毋须参考其它的ES。如在多核的并行处理中,就可以安排每个核单独处理一个ES。每个条编码为一个NAL单元,其容量小于等于最大网络传输单元( Maximum Transmission Unit,MTU) 容量。
在HEVC中新引入了片( Tile)的划分,用水平和垂直的若干条边界将图像帧划分为多个矩形区域,每个区域就是一个片,每一个片包含整数个CTU,片之间也可以互相独立,以此实现并行处理。片划分时并不要求水平或垂直边界均匀分布, 可根据并行计算和差错控制的要求灵活掌握。在编码时图像中的片也是按扫描顺序进行处理,每个片中的CTU 也是按扫描顺序进行。在HEVC中,允许条和片在同一图像帧中同时使用,既可以一个条中包含若干片,又可以一个片中包含若干条。
取样结构方面还是以前那三样,但是在比特深度方面,HEVC引入了一项新技术,提供了一种对编码器内外有别的比特深度表示方式,即内部比特深度增加( IBDI,Internal Bit Depth Increase)方式。这种方式允许在编码器内采用高于8比特的像素深度(如10比特)进行编码运算,而编码器外部,即编码器的输出图像仍然是8比特深度。这是因为8比特深度对人眼来说可能已经足够了,但是对编码处理而言,有时显得精度不够,往往会带来的计算误差和累积误差。
除了比特深度之外,HEVC还有一点值得注意的是它没有提供专用于隔行视频的工具,而是将隔行视频的一帧看作两个独立的场,对各个场数据分别进行编码,简化了编码器的实现。这也是因为随着数字视频技术的快速发展,视频的隔行扫描方式日渐式微。
HEVC为亮度信息定义了 33 种不同的帧内预测方向,连同平面( Planar) 和直流( DC) 模式,总共35种帧内预测模式。DC模式和H.264 /AVC 类似,对当前块的所有像素使用同一个预测值,即它们的平均值。平面模式的预测值由水平和垂直两个方向上已知像素的线性内插产生,特别适用于图像的平坦区域。在帧内编码中色度信号也采用相应亮度信号所采用的预测模式。这样,对于色度信息,HEVC有5种帧内预测模式: Planar 模式( 0) 、 垂直模式( 1)、水平模式( 2)、DC 模式( 3)和导出( derived) 模式( 4),即相应的亮度模式。
HEVC的帧间预测编码总体上和H.264 /AVC 相似,但进行了如下几点改进
(1) 非对称运动划分( Asymmetric Motion Partitions,AMP)
允许非对称地划分64×64到16×16的CU为更小的PU,PU可以是方形的, 也可以是矩形的。每个采用帧间预测方式编码的PU都有一套运动参数,包括运动矢量、参考帧索引和参考表标志。因为 AMP 允许 PU在运动估计和运动补偿中更精确地符合图像中运动目标的形状,而不需要进一步的细分来解决,因此可以提高编码效率。
(2) 运动合并( Motion Merge)
HEVC对运动参数的编码有3种模式,简称之为Inter 模式、Skip 模式和Merge 模式。前两种模式和 H.264 /AVC 类似,Merge模式是HEVC新引入的。这样, 对于每个帧间编码的 PU,可以在下列 3 种编码模式中选择: (1) 采用对运动参数直接编码(如对运动矢量进行预测编码)的Inter 模式,(2) 采用运动合并技术的 Merge 模式,(3)采用改进的 Skip 模式。Inter 模式需要传送当前编码 PU 的运动矢量来完成基于运动补偿的帧间预测。HEVC中运动矢量可采取空间或时间预测编码的方式( H.264 /AVC 仅采用空间预测)。而Skip 模式和Merge模式都无需传送MV 信息,只传送候选PU块的索引信息,由解码端采用运动推理( Motion Inference)方法(如拷贝)来获得运动信息,推理依据来自空域邻近块或时域邻近块(候选块)的MV。在Skip 模式中连残差信息也省略了,编码器只需要编码运动合并候选者的索引信息,以保证解码时Skip PU可以拷贝中选者的运动参数作为
自己的运动参数。这样,对那些帧间变化很少,或者运动静止的区域编码只需很少的比特。
在以往标准的帧间预测中,对以每个帧间预测块都要传输一套运动参数。为了进一步提高编码效率, 可对邻近的PU块进行合并(Merge)处理,形成Merge帧间预测编码模式,即将毗邻的运动参数相同或相近的几个PU块合并起来形成一个所谓的“小区”( Region),只要为每个小区传输一次运动参数,不必为每个PU块分别传输运动参数。在运动合并模式中,HEVC 为当前正在编码的PU创建一个先前已编码的邻近PU (称为“候选”PU) 列表。其中候选PU既可以是在编PU的空间邻近,也可以是时间邻近。编码器按照率失真准则选取并标注这个运动合并列表中哪一个候选PU被选中,继而使得当前编码的PU在解码时只要拷贝中选PU的运动参数。显然,运动合并方式不需要为当前PU去编码运动矢量,取而代之的是只需要编码运动合并列表中候选者的简单索引信息。
Merge 模式的这种 MVP 候选集的设置和选择方法在 HEVC 中称之为高级运动矢量预测( Advanced Motion Vector Prediction, AMVP),它也同样适用于 Skip 模式和Inter模式的最佳MVP块的选择。
(3) 参考图片管理
H.264/MPEG-4 AVC中使用基于滑动窗口(Sliding Window)和MMCO(Memo Management Control Operation,内存管理控制操作)的方式对DPB(Decoded Picture Buffer,解码图片缓存)中的图片进行操作。H.264/MPEG-4 AVC使用的是基于“命令”的参考图片管理方式。由于HEVC中支持时间可分级,高时间级别的图片可以人为的被丢弃。若被丢弃的图片中含有控制DPB的命令,则会导致不正确的DPB状态。故HEVC使用更为鲁棒的基于状态的RPS(Reference Picture Set,参考图片集合)的方式对DPB中的参考图片进行管理。HEVC中的RPS并不是基于命令的,而是基于状态的,故更为稳健,抗差错性也更强。
HEVC 的量化机理和 H.264 /AVC基本相同,是在整数DCT变换时一并完成的。HEVC采用了率失真优化的量化( Rate Distortion Optimized Quantization,RDOQ) 技术,在给定码率的情况下选择最优的量化参数使重建图像的失真最小。量化操作是在变换单元 TU 中分别对亮度和色度分量进行的。在TU中所有的变换系数都是按照一个特定的量化参数 QP 统一进行量化和反量化的。HEVC的RDOQ 可比H.264 /AVC提高编码效率 5% 左右(亮度) ,当然带来的负面影响是计算复杂度的增加。
HEVC只采用了CABAC进行熵编码,而没有使用CAVLC。
除此之外,考虑到高清、超高清视频编码的巨大运算量,在HEVC提供了基于条和基于片的便于并行编码和解码处理的机制。然而,这样又会引起编码性能的降低,因为这些条和片是独立预测的,打破了穿越边界的预测相关性,每个条或片的用于熵编码的统计必须从头开始。为了避免这个问题,HEVC 提出了一种波前并行处理( Wavefront Parallel Processing,WPP)的熵编码技术,在熵编码时不需要打破预测的连贯性,可尽可能多地利用上下文信息。
在编码的波前并行处理时,一旦当前 CTU 行上边的两块 CTU 已经处理完了,立即用一个新的并行进程(通常是一个新的线程) 开始处理这新的一行CTU,其过程如图所示。之所以需要两块 CTU,是因为帧内预测和运动矢量预测需要依赖于来之当前CTU 上边和右上边的 CTU 的数据。WPP 熵编码初始化的参数可来自于从当前行上边的两块完全编码的 CTU 获得的信息,这样就可在新的编码线程中使用尽可能多的上下文信息。
环路滤波( Loop Filtering)位于编码器预测环路中的反量化/反变换单元之后、重建的运动补偿预测参考帧之前。因而,环路滤波是预测环路的一部分,属于环内处理,而不是环外的后处理。环路滤波的目标就是消除编码过程中预测、变换和量化等环节引入的失真。 由于滤波是在预测环路内进行的,减少了失真,存储后为运动补偿预测提供了较高质量的参考帧。HEVC 除了采用和 H.264 /AVC类似的环内去方块滤波( DeBlocking Filter,DBF) 外,还增加了新的样值自适应偏移( Sample Adaptive Offset,SAO)环内滤波工具,形成了2 个按顺序进行的处理: 去方块滤波和SAO滤波。
去方块滤波方面,首先我们知道方块效应是由于采用图像分块压缩方法所形成的一种图像失真,尤其在块的边界处更为明显。为了消除这类失真,提高重建视频的主观和客观质量,H.264 /AVC 在方块的边界按照“边界强度”进行自适应低通滤波,又称去方块滤波。HEVC也使用了类似的环内去方块滤波来减轻各种单元边界(如CU、PU、TU 等)的块效应。HEVC 为了减少复杂性,利于简化硬件设计和并行处理,不对4×4的块边界滤波,仅对8x8边界进行滤波,且仅定义了3个边界强度等级( 0、1 和2),滤波边界附近的像素,省却了对非边界处像素的处理。在滤波前,对于每一个边界需要判决: 是否需要进行去方块滤波? 如果需要,还要判决到底是进行强滤波还是弱滤波。判决是根据穿越边界像素的梯度值以及由此块的量化参数 QP 导出的门限值共同决定的。HEVC的去方块滤波对需要进行滤波的各类边界统一进行,先对整个图像的所有垂直边界进行水平方向滤波,然后再对所有的水平边界进行垂直方向滤波。
样值自适应偏移( SAO) 是HEVC的一项新的编码工具,对要重建的图像逐像素进行滤波。它先按照像素的灰度值或边缘的性质,将像素分为不同的类型,然后按照不同的类型为每个像素值加上一个简单的偏移值,达到减少失真的目的,从而提高压缩率。加偏移值有两种模式,带偏移( Band Offset,BO)和边缘偏移( Edge Offset,EO)。编码器对图像的不同区域选择施加BO模式或EO模式的偏移,并在码流中给出相应的标识。
BO模式将像素值从0到最大值分为32个相等的间隔——“带( bands)”,例如对8比特而言,最大值是 255,则此时的带的宽度就是256 /32 = 8,每个带所包含的像素值都比较相近。如果某 CTB 的亮度值分布在4个相邻的带中间,说明这原本是一个比较平坦的图像区域,这样的区域人为失真容易出现,则需对这些像素值施加偏移量(可正可负),使像素值的分布趋向更集中。当然这个偏移量也要作为带偏移传输到解码端。
EO模式使用一种3像素结构来对所处理的像素进行分类。在该像素所处边缘(一维) 的方向上、以该像素为中心再加上最近邻的2个像素,形成45°、垂直、水平和 135°四种“3 像素结构”,如图所示。按照3像素值的不同分布,该像素可被分为峰值像素(如果其值大于相邻的2个像素) ,谷值像素(如果其值小于相邻的 2 个像素),边缘像素(如果其值等于任何一个相邻像素)和其它像素(如果不符合前 3 种) 共4类。对4类不同的像素所加的偏移值也不同。
最后来简单顺一遍HEVC的编码过程,如下图
输入HEVC编码器的是原始视频序列,原始视频序列会先按照LCU(Largest Coding Unit,最大编码单元)分成不重叠的矩形块。对于每个LCU,编码器先要选择合适的CU四叉树划分方式。对于每个不再继续划分的CU,编码器会选择合适的预测方式进行预测。CU可以继续划分为PU和TU。经过预测后,原始信号和预测信号的差称作残差信号,而残差信号经过变换量化后传递到解码端。预测值加上经过反变换和反量化后重建的残差值构成了重建值。而此重建值需经过滤波(包括去块效应滤波和SAO)处理后,构成最终的输出图片。
以上介绍了HEVC标准的相关内容,并且在最后简单梳理了一下HEVC的编码流程,下一篇文章中将会介绍HEVC所采用的全新的码率控制算法。
关注下方公众号,回复“hevc代码分析”,查看本文完整pdf文档下载链接
关注公众号,掌握更多多媒体领域知识与资讯
文章帮到你了?可以扫描如下二维码进行打赏~,打赏多少您随意~