H264 编码原理

1编码概述

ISO-MPEG/ITU-T 系列:由国际标准组织机构(ISO)下属的运动图象专家组(MPEG)和国际电传视讯联盟远程通信标准化组织(ITU-T)开发的系列编码标准。

  • H.264,也被称为高级视频编码(Advanced Video Coding,简称 AVC),是一种被广泛使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准。

  • H.265,也被称为高效率视频编码(High Efficiency Video Coding,简称 HEVC),是 H.264 的继任者。HEVC 被认为不仅提升图像质量,同时也能达到 H.264 两倍的压缩率(等同于同样画面质量下比特率减少了 50%),可支持 4K 分辨率甚至到超高画质电视,最高分辨率可达到 8192×4320(8K 分辨率),这是目前发展的趋势。

  • H.266,也被称为多功能视频编码(Versatile Video Coding,简称 VVC),是 H.265 的继任者。VVC 对 8K 超高清、屏幕、高动态和 360 度全景视频等新的视频类型以及自适应带宽和分辨率的流媒体和实时通信等应用有了更好的支持。根据最近的 JVET 官方主观测试结果,VVC 的平均编码性能相对 HEVC 的提高已经可以达到 49%。

要对视频进行编码,则主要是研究视频数据中的冗余信息,并对其进行压缩。视频信息主要包括这几个方面的冗余:

  • 空间冗余:在同一张帧之中,相邻的像素之间通常有很强的关连性,这样的关连性即为空间上的冗余信息。

  • 时间冗余:在视频信息中,相邻的帧与帧之间通常有很强的关连性,这样的关连性即为时间上的冗余信息。

  • 编码冗余:视频中不同数据出现的概率不同,欲编码的符号的几率分布是不均匀的。

  • 视觉冗余:人的视觉系统对某些细节不敏感。视觉上的冗余信息是指在人在观看视频时,人眼无法察觉的信息。

2基本概念

H264的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达成这两个目标,H264的解决方案是将系统框架分为两个层面,分别是视频编码层面(VCL:Video Coding Layer)和网络抽象层面(NAL:Network Coding Layer),H.264原始码流(裸流)是由⼀个接⼀个NALU组成,如下图:

VLC层是对核心算法引擎、块、宏块及片的语法级别的定义,负责有效表示视频数据的内容,最终输出编码完的数据SODB;

NAL层定义了片级以上的语法级别(如序列参数集和图像参数集,针对网络传输,后面会描述到),负责以网络所要求的恰当方式去格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。

H.264 结构中,一幅视频图像编码后的数据叫做一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏块(MB)组成,一个宏块由 16x16 的 YUV 数据组成。宏块是 H.264 编码的基本单位。

在 H.264 协议内定义了三种帧,分别是 I 帧、B 帧与 P 帧。

1)I 帧

I 帧,即帧内编码图像帧,不参考其他图像帧,只利用本帧的信息进行编码。

2)P 帧

P 帧,即预测编码图像帧,利用之前的 I 帧或 P 帧,采用运动预测的方式进行帧间预测编码。

3)B 帧

B 帧,即双向预测编码图像帧,提供最高的压缩比,它既需要之前的图像帧(I 帧或 P 帧),也需要后来的图像帧(P 帧),采用运动预测的方式进行帧间双向预测编码。

IDR 帧全称叫做 Instantaneous Decoder Refresh,是 I 帧的一种。IDR 帧的作用是立刻刷新,重新算一个新的序列开始编码,使错误不致传播。I 帧有被跨帧参考的可能,但 IDR 帧不会。

GOP(Group Of Pictures)是图像组的概念,它指的是视频编码序列中两个 I 帧之间的距离。通常意义上的 GOP 由 I 帧开始,到下一个 I 帧之前的帧结束。严格意义上讲,这个 I 帧是一个 IDR 帧。

H.264 使用的是封闭 GOP(Closed GOP),即在一个 GOP 中所有帧的解码不依赖该 GOP 外的其他帧,除了第一帧必须是 I 帧,其他帧可以是 P 帧或 B 帧。

3 帧结构

H.264 中码流分层结构:

在 H.264 中,分层结构相较之前最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的大部分句法元素游离出来形成序列和图像两级参数集,其余的部分则放入片层。在这种机制下,由于参数集是独立的,可以被多次重发或者采用特殊技术加以保护。参数集与参数集外部的句法元素处于不同信道中,这是 H.264 的一个建议,我们可以使用更安全但成本更昂贵的通道来传输参数集。

SPS 和 PPS 序列参数集SPS(Sequence Parameter Sets)

图像参数集PPS(Picture Parameter Sets)

整个码流,大概得数据帧组成格式:

4编码器原理

编码器的结构大概如下:

处理的图像帧分割成多个16×16的宏块,根据图像编码类型I帧、P帧或B帧等,决定是对图像数据本身处理还是对残差编码处理。图像数据本身即帧内编码I帧,利用图像的空间相关性,去除空间冗余。残差编码,首先利用运动估计技术,在一定范围的窗口内搜索相对最佳宏块,然后相减形成残差,同时记录当前宏块的运行向量MV。对图像数据或残差做DCT变换、量化。为了解码器解码时图像不产生偏移,还要做IDCT变换、反量化,重建形成参考帧。由于块处理造成“块效应”,为了提高参考图像的准确度、清晰度,可采用环路滤波提高图像清晰度。最后对量化后的系数、运动向量及其他信息做熵编码,形成最后的码流。

4.1 帧内预测

对I帧的编码是通过利用空间相关性实现的。为了能进一步利用图像空间相关性,H.264/AVC引入了帧内预测以提高压缩效率。总体来说,帧内预测编码就是用周围邻近的像素值来预测当前的像素值,然后对预测误差进行编码。帧内预测是基于图像块,对于亮度分量(Luma),块的大小,可以在16×16和4×4之间选择,16×16块有4种预测模式(垂直Vertical,水平Horizontal,直流分量DC,平面Plane),4×4块有9种预测模式(直流分量DC,8个方向)。对于色度分量(Chroma),预测是对整个8×8块进行的,有4种预测模式(垂直Vertical,水平Horizontal,直流分量DC,平面Plane)。除了DC预测外,其他每种预测模式对应不同方向上的预测。

(1)16×16亮度预测模式

16×16亮度预测信号根据预测的方向不同有4种预测模式,其预测模式如图6-5所示。分别是垂直方向、水平方向、DC、平面模式。

2)4×4亮度预测模式

在4×4亮度预测模式中,H.264/AVC把16×16的宏块划分成16个4×4的子块,每个子块用与其相邻的上面和左面已经编码并重建后的像素点进行预测

3)8×8色度预测模式 色度分量以8×8块为单位进行预测,它与16×16亮度预测模式类似。其中相同位置的两个色度块U/Cb和V/Cr具有相同的最佳预测模式

4.2帧间预测

帧间预测是利用先前编码帧的重建图像作为参考,对当前图像进行预测编码的一种方式。它把参考图像的抽样点通过运动矢量的补偿,作为当前图像抽样值的参考值。和以往标准相比,H.264/AVC帧间预测的区别在于块尺寸更丰富,采用了1/4精度运动矢量、多参考帧等方法。

(1)树状结构的运动补偿

帧间预测用于降低图像的时域相关性,通过采用多帧参考和更小运动预测区域等方法,对下一帧进行精确预测,从而减少传输的数据量。每个亮度宏块可以被划分为形状不等的区域。宏块及子宏块分割如图6-7所示。图中一个16×16的亮度宏块有4种:1个16×16或2个16×8或8个8×16或4个8×8。而8×8模式的每个子宏块可以进一步进行分割,也有4种:1个8×8,2个4×8,2个8×4,或4个4×4。

每个分割或子宏块都有一个独立的运动补偿。每个运动矢量都须被编码、传输,分割的选择也要将编码压缩到比特流中。对于较大的分割尺寸,运动矢量的选择和分割的选择只需少量的比特,但运动补偿残差较多。小尺寸的分割可以减少运动补偿后的残差,但是需要传输较多的运动矢量和分割的选择。因而,大尺寸分割适合于较平坦的区域,小尺寸分割适合较多细节区域。宏块的色度成分(Cr, Cb)为相应亮度的一半,采用和亮度相同的分割模式,只是尺寸减半。

(2)1/4精度运动矢量

H.264/AVC中的运动矢量对亮度信号采用1/4精度。当运动矢量指向整数抽样点位置时,预测值将直接从相应的参考图像中抽样获取。当运动矢量指向分数抽样点时,其分数位置的像素并不存在于参考图像中,需利用邻近的已编码点进行内插得到。内插像素的生成方法如下:

4.3整数变换DCT及量化

H.264/AVC中的宏块大小为16×16,对其中每个4×4大小的块进行4×4的整数DCT变换后,得到16个4×4的变换矩阵。为了进一步提高压缩效率,该协议还允许把每个4×4的变换矩阵中的直流分量DC,单独取出组成一个新的4×4矩阵,对此矩阵进行Hadamard变换。整数DCT避免了以往标准中的编解码不匹配问题,使得反变换不会出现失衡的问题。并且其运算只包含加减和移位,且将量化融合在其中,有效的降低了运算量。H.264/AVC编码中整数变换及量化过程如图6-9所示。宏块的数据传送顺序如图6-10所示,图中上方的-1、16、17为直流分量形成的4×4、2×2块。

4.4重排序

变化系数经量化后,在低频和直流区域会有少量大值,在高频区域会有少量小值,其他系数大部分是0.为了更有效的编码,通常需要利用信源统计特性进行熵编码。而熵编码需要对信源进行锯齿扫描和游程编码。 锯齿扫描如下图所示:可以将二维数据转化为一维数据。

游程编码用三个值表示,0的个数(游程)、系数值和最后的值。如非零系数已处于最后的位置或其后均为0则值为1,否则值为0.

如锯齿扫描后的数据:15,0,0,-3,4,5,0,0,0,0,7,0,0,0,0

则游程编码为:(0,15,0),(2,-3,0),(0,4,0),(0,5,0),(4,7,1)

4.5 熵编码

H.264/AVC协议对于图像数据或残差提供了两种熵编码的方式,分别为基于上下文自适应变长码CAVLC(Context-based Adaptive Variable Length Coding)和基于上下文自适应二进制算术编码CABAC(Context-based Adaptive Binary Arithmetic Coding);如果不是预测残差,而是运动向量等其他数据,H.264/AVC则采用Exp-Golomb码或CABAC编码,视编码器的设置而定。

(1)CAVLC

变长编码VLC的基本思想就是对出现频率大的符号使用较短的码字,而出现频率小的符号采用较长的码字,这样可以使得平均码长最小。CAVLC中,H.264/AVC采用若干VLC码表,不同的码表对应不同的概率模型。编码器能够根据上下文,在这些码表中自动地选择如周围块的非零系数或系数的绝对值大小。最大可能地与当前数据的概率模型匹配,从而实现了上下文自适应的功能。

(2)CABAC

算术编码是一种高效的熵编码方案,其每个符号所对应的码长被认为是分数。由于对每一个符号的编码都与以前编码的结果有关,所以它考虑的是信源符号序列整体的概率特性,而不是单个符号的概率特性,因而它能够更大程度地逼近信源的极限香浓熵,降低码率。为了绕开算术编码中无限精度小数的表示问题,对信源符号概率进行估计,现代的算术编码多以有限状态机的方式实现,H.264/AVC的CABAC便是一个例子,其他的例子还有JPEG2000。在CABAC中,每编码一个二进制符号,编码器就会自动调整对信源概率模型(用一个“状态”来表示)的估计,随后的二进制符号就在这个更新了的概率模型基础上进行编码。这样的编码器不需要信源统计特性的先验知识,而是在编码过程中自适应地进行估计。显然,与CAVLC编码中预先设定好若干概率模型的方法比较起来,CABAC有更大的灵活性,可以获得更好的编码性能——大约降低10%的码率。

4.6 反变换+反量化

为了提供预测用的参考图像(毕竟解码得到的图像与原始图像不同,编码器需要将解码得到的图像作为参考图像),编码器必须有重建图像的功能。则可以通过编码的逆操作进行反量化+反变换得到残差图像,再将残差图像与预测值相加,得到理论上的参考图像。

4.7 去块效应环路滤波器

去除块效应滤波器(Deblocking Filter或Loop Filter),它的作用是,消除经反量化和反变换后,重建图像中由于预测误差产生的块效应,即块边缘处的像素值跳变,从而一来改善图像的主观质量,二来减少预测误差。H.264/AVC中的Deblocking Filter还能够根据图像内容做出判断,只对由于块效应产生的像素值跳变进行平滑,而对图像中物体边缘处的像素值不连续给予保留,以免造成边缘模糊。与以往的Deblocking Filter不同的是,经过滤波后的图像将根据需要放在缓存中用于帧间预测,而不是仅仅在输出重建图像时用来改善主观质量,也就是说该滤波器位于解码环中,而非解码环的输出外,因而它又称作环路滤波Loop Filter。需要注意的是,对于帧内预测,使用的是未经过滤波的重建图像。

滤波前后的效果对比:

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值