h264编码流程分析

简介: h264编码流程分析

H.264/AVC作为新一代视频编解码标准,提供了以往视频算法没有的新特性。比如多帧参考,以更灵活的方式使用更多的重建帧作为参考帧。在某些情况下,可以使用最多32个参考帧(在以往标准中,P帧的参考帧数目为1,B帧的参考帧数目为2)。该特性对大多数场景序列都可以带来一定的码率降低,或者质量提高。对某些类型的场景序列,例如快速重复的闪光,反复的剪切或者背景遮挡的情况,它能很显著的降低编码的码率。


H.264/AVC视频编码标准的数据处理流程仍然是混合编码框架,即基于像素块的运动补偿、变换、量化和熵编码的处理模块。H.264/AVC算法的这些处理模块都做了技术改进,以提高编码效率。典型的视频编码框架如图6-2所示。


4c251b09e57f4e48bb64d7e1860a51cf.jpg


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

H.264/AVC将视频压缩系统分成了视频编码层VCL(Video Coding Layer)和网络提取层NAL(Network Abstract Layer)两层,其结构如图6-3所示。视频编码层VCL通过时域、空域预测和变换编码来完成对视频信息的压缩。而网络提取层NAL则将与网络相关的信息从视频压缩系统中抽象出来,使网络对于视频编码层是透明的,它主要负责对编码后的数据进行封装,以提高其鲁棒性、降低误码率。采用分层结构有利于压缩编码与网络传输之间的分离,使视频编码层可以移植到不异构的网络中,适应不同的网络传输。


67609215ab964618a36234b558b8381f.jpg


视频编码层VCL是H.264/AVC的核心技术,视频算法是混合编码技术框架,包括变换、量化、编码三步骤。不过每个过程有了新的技术,码流更小、图像效果更好。通过每个模块的小的技术改进,而带来了系统整体性能的提升。变换的数据根据I帧编码、P/B帧编码,采用帧内预测和帧间预测(运动估计ME)。宏块的类型除了传统的16×16方式外,还增加了多种类型,如16×8、8×16、8×8等,更贴近物体运动模型。变换采用可逆的整数变换,使解码过程无误差积累。熵编码采用上下文自适应的可变字长编码CAVLC、二进制算术编码CABAC,码流更低。另外由于DCT块处理的原因,图像有块效应,编码器采用了内部环路滤波去除块效应。这些技术都是以前视频编码标准所没有的,但是工作原理相同。H.264/AVC编码器的工作框图如图6-4所示。


7f8f80e6c49141939fafa406670161d8.jpg


1.帧内预测

对I帧的编码是通过利用空间相关性实现的。以前的视频标准只利用了一个宏块MB内部的相关性,而忽视了宏块之间的相关性,所以编码后的数据量较大。为了能进一步利用图像空间相关性,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、平面模式。


c83eb6f26fea4461886206497d244e3f.jpg


2)4×4亮度预测模式


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


d14f0d70a7e04491a8f98c9b227df2a4.jpg


4×4亮度信号根据预测方向的不同共有9种不同的预测模式。其预测模式如图6-6所示。其中,垂直预测(模式0)、水平预测(模式1)、DC预测(模式2)总是被认为是有效的,即使在上边或左边像素值不存在的情况下,也可认为不存在的像素值为128填充,来进行预测。而其它模式则只有在其需要使用的像素值存在的情况下,才能进行预测。

(3)8×8色度预测模式

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

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。


530d642045d34e21b7fe538b1cff5029.jpg


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

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

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


13f177ff4356467d9fcf7af7bbef6a99.jpg


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块。


d37ba514ba2c4d729ee730eb0324135a.jpg

acb8237ecef0478d8581f7b4cd30785b.jpg


4.熵编码

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%的码率。

5.去块效应环路滤波器

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


6.多参考帧的帧间预测

以往的P帧编码是以前面重建的帧作

为参考,进行运动估计预测得到最佳匹配块。B帧编码同样是以前后重建帧为参考预测得到残差。H.264/AVC提供了多个参考帧的帧间预测模式,使估计到的宏块更贴近实际运动物体模型,运动向量表示更精确。但在选用多帧参考的同时,计算量巨增,在使用DSP硬件实现H.264/AVC时,多帧参考的帧间预测并不启用。

7.提供SP/SI帧支持

H.264/AVC在支持I/P/B帧编码方式的同时,增加支持SP/SI帧编码方式。以上三种与以前的标准相似,主要是参考图像不同,其余两种像条类型是SP(切换P)、SI(切换I),是新的类型,用于在不同位率编码码流之间进行有效切换。与SP帧:称作切换P帧,能在不同编码图像之间有效地切换。SI帧:称作切换I帧,允许SP帧的宏块完全匹配,达到随机读取数据进行解码和恢复错误的目的。

8.其他新特性

(1)编码器控制

视频编码的控制是编码器实现的核心问题。由于视频序列中的图像内容随着空间与时间的不同而变化很大,因此,需要为图像的不同部分选择不同的编码参数进行压缩编码,而编码控制的目的就是确定一组编码参数。H.264编码器采用基于Lagrangian优化算法的率失真优化模型实现视频编码的控制,其实现方法简单而且效率高。

(2)参数集

H.264引入了参数集的概念,每个参数集包含了相应的编码图像的信息。序列参数集SPS包含的是针对一连续编码视频序列的参数选择标识,如帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式等。图像参数集PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如熵编码模式选择标识、片组数目、初始量化参数和去除块滤波系数调整标识等。

以上是H.264/AVC相对以往视频编码标准的技术的主要改进之处,效果也最明显。H.264/AVC相对MPEG-2/4、H.263在相同码率下,图像质量PSNR提高3dB多。图6-11是标准视频测试序列Foreman.qcif的不同编码器的码率对PSRN的比较图。通过比较可以看出, H.264/AVC的码率Bit-rate在相同质量Quality(亮度Y的PSNR)下,可节省非常可观的码流。


1dc24ef1886542c3a8c0ac2238cf8c85.jpg


表6-1列出了无B帧时,相同图像质量PSNR条件下,平均节省码流百分比。分析可以看出H.264/AVC比MPEG-4 SP节省34%的码流,这极大的鼓舞了人们的大力研发投入。但是同时也应该看到,H.264/AVC获得优越性能的代价是计算复杂度增加。据估计,编码的计算复杂度大约相当于H.263的3倍,解码复杂度大约相当于H.263的2倍。


be1903a726754cfa8bae3c9b08c567d0.jpg


不过让研发工程师欣慰的是,芯片ASIC、可编程DSP、FPGA、CPU等实现平台的性能在日益提升,多核处理器也已出现,可编程的数字媒体处理器也已经出现,如TI的DM64x系列、ADI的BlackFin系列、Philips的PNX系列等,Intel的双核CPU并支持SSE4媒体处理指令。硬件性能的逐步提升,实时实现复杂的视频算法已成为可能。


相关文章
|
6月前
再见手动编码,标准自动化编码规则来帮忙!
标准管理员小S面临数据标准编码管理的挑战:编码格式不统一、编码值不可读活相关性差,手动管理耗时易出错。Dataphin新推出“标准编码规则”功能,可以实现一次配置批量生成编码,并通过自增序列、固定字符串和所属标准集编码的组合,保证编码相关性和灵活性,同时提供了编码规则变更后的批量订正功能,大大简化管理工作。小S对此表示高度满意。
136 0
编码细节引起的思考
小编感悟:初始菜鸟的我们,在运用封装好的方法时,不仅要学习如何使用,更要学习封装的方法中还有什么东西,最后还要学习对应的方法是如何封装起来的,知识只有这样的学习才能够让自己变得更加强大。
研发管理—编码流程
研发管理—编码流程
70 0
|
JSON 前端开发 测试技术
手把手带你设计接口自动化测试用例(一):提取接口信息并分析
手把手带你设计接口自动化测试用例(一):提取接口信息并分析
552 0
手把手带你设计接口自动化测试用例(一):提取接口信息并分析
|
数据可视化 IDE 测试技术
如何用“心流”提升编码工作效率?
“心流”是人在做一件事情时投入到忘我的一种精神状态,常见于运动员、艺术家和科研人员身上。 “心流”如何影响工作?我们可否解决“心流”带来的相关问题?
如何用“心流”提升编码工作效率?
|
数据采集 机器学习/深度学习 算法
模板信息提取阶段方案一
模板信息提取阶段方案一
107 0
组织解码之二
系统的视角理解组织,《首席组织官》
147 0
|
数据处理
freeModbus流程分析
freeModbus流程注解
1164 0
freeModbus流程分析
|
机器人 开发工具 Python
阿里云RPA(机器人流程自动化)干货系列之十一:编码开发模块初探
导读:本文是阿里云RPA(机器人流程自动化)干货系列之十一,从本篇开始我们介绍采用编码模式开发一个简单的RPA应用,编码模式适用于有代码开发基础的同学,可以大大提高RPA流程的开发效率。 一、 编码开发介绍 阿里云RPA开发模式有可视化开发和编码开发两种模式,在《阿里云RPA(机器人流程自动化)干货系列之七:编写第一个RPA应用(可视化模式)》,编码开发模式采用Python语言,在客户端新
3916 0
|
存储 自然语言处理
分析的过程
模块 词法分析器 语法分析器 代码生成器 操作 通过词法分析器将源文件转为Token存储起来 通过语法分析器调用词法分析器获取一个Token, 在调用代码生成器生成目标代码, 所有是并行的
730 0