MPEG-4_H.264视频编解码工程实践
1.2 视频编码压缩原理及主流算法
2018-11-05 22:23:34
空间域的图像变换到频域,即所谓的变换域,会产生相关性很小的一些变换系数,并可对其进行压缩编码。
2018-11-05 22:23:05
视频编码中变换编码的数据源,包括两种:一是图像数据本身,二是图像残差。
2018-11-05 21:37:20
对图像做变换编码,最理想的变换运算应对整个图像进行,以便去除所有像素间的相关性。
2018-11-05 22:22:28
正因为是以宏块为处理单位,经编解码后的图像有明显的块效应,这就需要用户在解码低码流的视频时增加后处理以提高图像质量。
2018-11-05 22:21:02
H.264提供了整数DCT/IDCT,其反变换是完全可逆的。H.264图像在同码流下,明显优于其他以往标准算法,很重要的一个特点就是变换编码采用了整数DCT
2018-11-05 21:41:52
量化是视频编码失真的根本原因。
2018-11-05 21:44:29
XviD的MPEG-4算法的H.263量化方式有32(0~31)个量化等级,而H.264有52(0~51)个量化等级。
2018-11-05 21:45:22
变换使空域的图像能量重新分布,主要集中在左上角。右下方大部分是较小值或零值。
2018-11-05 22:19:50
混合视频编码框架的最后一个模块熵编码,就是利用概率分布规律实现无损的统计编码的,其原理是:符号出现概率大的用短码字来表示,符号出现概率小的用长码字来表示,从而起到了数据压缩的目的
2018-11-05 21:49:42
MPEG1/2/4和H.261/263等采取的是
2018-11-05 21:49:59
Huffman编码,H.264中Baseline级的熵编码是上下文自适应的可变字长编码CAVLC,即改进的Huffman编码,H.264中的Main或Extended级的熵编码采取的是上下文自适应的二进制算术编码CABAC。
2018-11-05 21:51:18
熵编码是针对图像或残差,而视频编码算法的其他信息如运动向量、直流分量、编码模式等控制信息的编码方式采用其他方法。如H.264中采取的是哥伦布编码(Golomb)。
2018-11-05 22:19:10
视频数据的失真主要存在于变换、量化。如果变换可逆则只存在于量化。
2018-11-05 22:32:15
MPEG-4的标准号是ISO/IEC 14496,定稿于1998年10月,于1999年1月成为国际标准。完全向后兼容的MPEG-4第二版于1999年底定稿,于2000年初被正式接受为国际标准,有些细节仍在制定过程中。
2018-11-05 22:33:00
视频对象编码是把视频场景按照对象目标进行分割,一般包括场景和场景的各个目标。对不同的目标对象选用不同的编码技术,从而达到系统、的高效的视频编码。
2018-11-05 22:36:34
由于视频对象分割目前仍然是个难点,还处于尚未成熟或研究阶段,MPEG-4的应用和开发仍然是基于像素的传统视频编码。只是把整个帧看做一个对象VOP(Video Object Plance),分别编码纹理信息(残差或图像本身)和运动信息(运动向量)。
2018-11-05 22:38:01
对于某一特定的应用,只有一部分编码工具被采用,框架(Profile)就是针对特定的应用确定要采用的编码工具,它是MPEG-4提供的工具集的一个子集。每一个框架又有一个或多个级别(Level)来限制算法的复杂度。
2018-11-05 22:39:58
MPEG-4之前的视频标准都是采用第一代压缩编码技术,基于图像信号的统计特性来设计编码器,属于波形编码的范畴。第一代压缩编码方案把视频序列按时间先后分为一系列帧,每一帧图像又分成宏块以进行预测、运动补偿和编码,这种编码方案存在以下缺陷:● 将图像分成相同大小的块,高压缩比情况下会出现严重的块效应;● 无法对视频内容进行访问、编辑和回放等操作;● 未充分利用人类视觉系统HVS(Human Visual System)的特性。
2018-11-05 22:40:40
MPEG-4代表了基于模型和对象的第二代压缩编码技术,它充分利用了人眼视觉特性,抓住了图像信息传输的本质,从轮廓、纹理思路出发,支持基于视觉内容的交互功能
2018-11-05 22:45:54
MPEG-4实现基于内容操作的前提是把视频/图像分割成不同对象,或者把运动对象从背景中分离出来,然后针对不同对象采用相应的编码方法,以实现高效压缩。
2018-11-05 22:42:31
因此,尽管MPEG-4框架已经制定,但至今仍没有通用的有效方法去根本解决视频对象分割的问题
2018-11-05 22:45:46
视频对象平面(VOP)是视频对象(VO)在某一时刻的采样,VOP是MPEG-4视频编码的核心概念。MPEG-4在编码过程中针对不同VO采用不同的编码策略,即对前景VO的压缩编码尽可能保留细节和平滑;对背景VO则采用高压缩率的编码策略,甚至不予传输而在解码端由其他背景拼接而成。
2018-11-05 22:45:21
视频编码的可分级性(Scalability)是指码率的可调整性,即视频数据只压缩一次,却能以多个帧率、空间分辨率或视频质量进行解码,从而可支持多种类型用户的各种不同应用要求。
2018-11-05 22:49:31
钻石搜索法DS(DiamondSearch)以搜索模板形状而得名,具有简单、鲁棒、高效的特点,是现有性能最优的快速搜索算法之一。
2018-11-05 22:51:22
H.264算法还是基于块的混合编码技术,编码过程基本与以前的编码标准相同,只是每个功能模块都进行了技术更新,帧内预测、帧间预测、整数DCT变换、环路滤波、熵编码等模块都做了技术提升。
2018-11-05 22:55:00
与以往的Deblocking Filter不同的是,经过滤波后的图像将根据需要放在缓存中用于帧间预测
2018-11-05 22:57:47
传统的DCT是由浮点算法定点实现,所以IDCT不是可逆的,容易造成解码图像的周围“拖尾”现象。H.264对帧内或帧间预测的残差(Residual)进行整数DCT变换编码。新标准对DCT的定义做了修改,使得变换仅用整数加减法和移位操作即可实现,这样在不考虑量化影响的情况下,解码端的输出可以准确地恢复编码端的输入。此外,该变换是针对4×4块进行的,这也有助于减少块效应。为了进一步利用图像的空间相关性,在对色度(Chroma)的预测残差和16×16帧内预测的预测残差进行上述整数DCT变换之后,标准还将每个4×4变换系数块中的DC系数组成2×2或4×4大小的块,进一步做哈达玛(Hadamard)变换。
1.3 视频解码原理及主流解码器
2018-11-05 23:03:18
视频解码流程是编码的逆操作。实际上,任何一个编码器都隐含了解码器的大部分操作,如对于MPEG-4视频编解码算法来说,在图像或残差做DCT变换、量化后,接着是反量化、IDCT变换,然后将重建的数据补偿到编码图像中,从而保证解码时数据不会产生偏差。
2018-11-05 23:07:55
运动补偿是解码器中的重点,占用了约60%以上的计算负荷,这是因为码流统计中帧间编码为主要的编码类型,而与之对应的处理就是插值运动补偿,根据从码流中解析的运动向量信息,定位参考帧的确切位置,然后计算1/2、1/4像素精度的插值,最后把结果补偿(加)到重建帧中。
1.5 开源的视频CODEC
2018-11-05 23:18:15
MPEG-1和MPEG-2编解码源码从MPEG的主页http://www.mpeg.org上可直接获取。
2.1 视频数据来源
2018-11-05 23:22:47
网站http://media.xiph.org/video/derf/提供了许多常用的测试序列,包括其他链接如http://trace.eas.asu.edu/yuv/的YUV文件,以及Y4M格式的视频文件。
3.1 概述
2018-11-05 23:46:22
MPEG-4(ISO/IEC14496)算法是ISO的运动图像专家组MPEG(Moving PicturesExpert Group)在1998年发布的。其设计初衷是第二代图像编码标准,即对象编码。不过,该算法并不包含对象的分割方法,只是提供了对分割对象后的编码方法。
3.2 Xvid视频编码分析
2018-11-06 23:44:08
对8×8块进行编码,按照其在宏块中排列的顺序进行。
2018-11-06 00:37:46
对当前编码块(或者经过运动补偿的差值)进行DCT变换。
注 | MPEG-4帧内编码没有预测编码,直接DCT |
2018-11-06 00:44:03
AC/DC预测,即在编码I帧时,对当前宏块的第一行或者第一列系数同它周围的某一块作一个差值,进一步增加零系数,降低比特率。
注 | 系数的预测 |
2018-11-06 10:03:28
在图像帧P帧编码中,有一定数量的Intra模式的块编码,其他绝大部分为Inter模式或not_coded不编码模式。算法支持当整整的Intra块编码模式超过一定数量时,强制为I帧编码。
注 | 表达有些问题,需要查查 |
2018-11-06 22:26:42
在P帧编码前,首先对整帧做运动估计,确定每个宏块的编码模式为,Intra、Inter、Not_coded。如果Intra块的数量超过宏块总数的一定比例,则强制该帧做I帧编码。
2018-11-06 22:29:24
图像Intra块的变换与量化一般是放置在一起。变换采用离散余弦变换(DCT),量化采用H.263的均匀量化。
2018-11-06 23:47:00
宏块(包括一个16×16的亮度块,两个8×8的色度快)
2018-11-06 22:32:01
为保证与解码图像一致,做反DCT和反量化,将重建值更新到编码图像。
2018-11-06 22:40:15
对于Inter宏块编码中,首先写mcbpc、cbpy、MV,最后写宏块系数。
2018-11-06 22:39:24
对于Intra宏块编码中,首先写mcbpc、AC预测方向、cbpy,最后写宏块系数。
3.3 Xvid视频解码分析
2018-11-06 22:44:44
几乎所有的MPEG-4视频应用都是基于传统的矩形视频帧来处理的。只不过MPEG-4把整个图像画面看做一个对象,即视频对象平面VOP(Video Object Plane)。
2018-11-07 00:10:48
首先初始化必要的参数和变量,解码得到DC直流分量的量化步长,接着预测DCT系数以获得预测器,解码直流分量、交流分量,反量化、反变换。最后把解码的宏块数据更新到当前解码图像空间。
3.4 Xvid的MMX/SSE技术优化
2018-11-07 00:23:06
单指令多数据技术(SIMD),以并行方式处理多个数据元素
2018-11-07 01:06:35
2
4.2 适于数字媒体处理的DSP
2018-11-07 09:54:02
TI公司于2003年推出第一款适于数字媒体处理的DSP,即DM642,它是基于TMS320 C64x的DSP内核。
5.3 DM642平台下优化Xvid视频编码
2018-11-07 16:39:04
Xvid视频编码算法是以16×16的宏块MacroBlock为单位循环处理的,宏块又有4个亮度块和2个色素块等6个块Block组成的。MPEG-4的SP档级视频编码包括I帧和P帧两种编码方式。
2018-11-07 16:57:36
对于I帧图像,帧内的图像宏块即首先做DCT变换,DCT系数分直流分量DC和交流分量AC。然后对变换后的系数做量化,量化分为均匀量化(即H.263方式)和量化表(mpeg-4方式),通常采取第一种方式。对量化后的系数的最上边一行和最左边一列实施预测(即相减),因为图像块之间差别很小,则DCT系数应含有很强的相关性,预测后的系数含有较多的零值。最后的处理即熵编码,通常采取可变长度的Huffman编码
注 | 预测细节? |
2018-11-07 16:59:22
对于P帧图像的编码,首先整帧图像与参考帧图像做运动估计,以宏块为单位,在一定窗口内搜索(即运动估计),通过SAD准则(图像宏块的差的绝对值的和)决定当前宏块是Intra块或Inter块的编码模式,并保存宏块的x和y方向的运动向量。
2018-11-07 20:17:25
MPEGX和H.26X系列标准采用了改进的Huffman编码或算术编码。
2018-11-07 20:20:13
编码器中的运动补偿,是指利用运动估计中的运动向量,定位准确的参考帧宏块,然后做减得到残差。即输入图像。而输出残差
5.4 DM642平台下优化Xvid视频解码
2018-11-07 20:24:08
视频解码器的工作流程为:首先解析码流的头字节以获得视频编码的信息,如图像的宽度和高度、帧率、量化步长、图像的编码方式(I或P帧)等,然后根据宽度和高度的大小循环宏块单位解码。解码的过程是,如果编码方式是I帧,依次执行熵解码、预测、反量化、反变换,如果编码方式是P帧,则依次执行运动向量解码、运动补偿、反量化、反变换。
2018-11-07 20:25:23
解码器中的运动补偿模块工作过程是,首先从参考帧补偿(即根据运动向量信息插值参考帧)得到当前解码图像的初版本,然后从码流解码获得残差,再将残差加到运动补偿得到图像,完成解码任务。
2018-11-07 20:27:22
Xvid的补偿是以8×8的块为单位的
2018-11-07 20:28:09
编码器和解码器均包含图像扩展的工作,即将所有参与图像放置在了二维空间中,图像的上、下、左、右四个边做了32个像素的扩展。
5.5 平台优化实验及分析
2018-11-07 20:32:00
运动估计和运动补偿是编码算法中的核心,是运算量的主要部分。
6.1 H.264概述
2018-11-07 20:58:59
最后形成了2003年5月发布的统一标准H.264/AVC。该标准在ITU-T中称为H.264,在ISO/IEC称为MPEG4-Part10AVC(Advanced Video Coding,高级视频编码)。即一个协议两个名称,一般称为H.264/AVC。
2018-11-07 20:59:50
JM是ITU-T提供的H.264/AVC参考软件,运行效率极低。可以作为H.264/AVC码流的验证模型,它包括视频编码和解码。JM的下载地址为:http://iphome.hhi.de/suehring/tml/。
6.2 H.264视频算法原理
2018-11-07 21:04:04
H.264/AVC是新一代视频编解码标准,提供了诸多以往视频算法所没有的新特性,以提高编码效率。这些新特性包括:● 利用临近块的边界像素的Intra空间预测,提供16×16、8×8、4×4预测模式。
2018-11-07 21:05:29
● 多参考帧的运动补偿。
2018-11-07 21:05:52
● 变块尺寸运动补偿。可使用最大16×16至最小4×4的块来进行运动估计与运动补偿
2018-11-07 21:06:17
● 完全可逆的整数DCT4×4变换,同样在高精度拓展中,采用整数8×8变换,并能在4×4变换和8×8变换中进行自适应的选择。
2018-11-07 21:06:46
● 在第一次4×4变换后,对DC系数(亮度、色度的DC系数)再进行一次Hadamard变换,使得其在平滑区域得到更好的压缩效果。
2018-11-07 21:07:17
● 宏块对结构允许场模式中采用16×16的宏块(相对于MPEG-2中的16×8)。
2018-11-07 21:07:38
● 加权的运动预测
2018-11-07 21:10:19
● 对既不是用CABAC也不是用CAVLC的语法元素,使用Exponential-Golomb(Exp-Golomb)熵编码方案,进行编码。
2018-11-07 21:14:44
● 灵活的宏块排列模式FMO(Flexible Macroblock Ordering,也被称为片组Slice Groups技术)和任意条带排列ASO(Arbitrary Slice Ordering)模式,用来更改图像编码的最基本单位——宏块的编码顺序。
2018-11-08 12:40:58
为了去除编码解码环路中产生的噪声,提高参考帧的图像质量,从而提高压缩图像性能,因此设置了环路滤波器,滤波后的输出
即为重建图像,可用作参考图像。
注 | 帧间编码用的是环路滤波后的图像,帧内编码用的是非环路滤波的图像 |
2018-11-08 12:44:35
帧内预测是基于图像块,对于亮度分量(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预测外,其他每种预测模式对应不同方向上的预测。
2018-11-08 12:46:25
其中,垂直预测(模式0)、水平预测(模式1)、DC预测(模式2)总是被认为是有效的,即使在上边或左边像素值不存在的情况下,也可认为不存在的像素值为128填充,来进行预测。
2018-11-08 12:48:38
帧间预测是利用先前编码帧的重建图像作为参考,对当前图像进行预测编码的一种方式。
2018-11-08 12:49:20
H.264/AVC帧间预测的区别在于块尺寸更丰富,采用了1/4精度运动矢量、多参考帧等方法。
2018-11-08 12:51:18
一个16×16的亮度宏块有4种:1个16×16或2个16×8或8个8×16或4个8×8。
2018-11-08 12:52:25
8×8模式的每个子宏块可以进一步进行分割,也有4种:1个8×8,2个4×8,2个8×4,或4个4×4。
2018-11-08 20:26:53
如果不是预测残差,而是运动向量等其他数据,H.264/AVC则采用Exp-Golomb码或CABAC编码,视编码器的设置而定。
2018-11-08 20:29:17
。与以往的Deblocking Filter不同的是,经过滤波后的图像将根据需要放在缓存中用于帧间预测,而不是仅仅在输出重建图像时用来改善主观质量,也就是说该滤波器位于解码环中,而非解码环的输出外,因而它又称作环路滤波Loop Filter。
2018-11-08 20:30:01
需要注意的是,对于帧内预测,使用的是未经过滤波的重建图像。
2018-11-08 23:54:08
H.264编码器采用基于Lagrangian优化算法的率失真优化模型实现视频编码的控制,其实现方法简单而且效率高。
2018-11-08 23:55:51
序列参数集SPS包含的是针对一连续编码视频序列的参数选择标识,如帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式等。
2018-11-08 23:57:08
图像参数集PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如熵编码模式选择标识、片组数目、初始量化参数和去除块滤波系数调整标识等
6.3 x264视频编码分析
2018-11-08 23:59:39
H.264/AVC协议T-REC-H.264-200305.doc
2018-11-09 00:01:55
x264的数据结构x264_param_t包含了x264编码器的所有参数字段。
2018-11-09 00:38:12
编码帧类型仍然分为I帧(x264_type_i)、P帧(x264_type_p)、B帧(x264_type_b),在H.264中叫图像片Slice。x264把整帧图像看作一个Slice,片中有slice_type_i、slice_type_p、slice_type_b之分。I帧只有slice_type_i,p帧有slice_type_i、slice_type_p,B帧三种片均有。
2018-11-12 23:41:30
x264的编码器结构体x264_t中的子结构体字段frames包含了4个临时视频帧序列空间:current、next、unused和reference,分别保存当前编码帧、将编码帧序列、未处理原始视频帧序列和参考帧序列,同时X264编码器还申请了fenc和fdec空间用于存放已编码帧和重建帧。
2018-11-12 23:49:17
编码器处理视频帧的顺序如下:首先,从YUV视频文件中读取图像存储到临时x264_picture_t变量pic_in,同时为unused申请存储空间,并用fenc指针指向这个空间。接着,将pic_in中的图片数据拷贝到fenc所指向的空间,并在拷贝完成后对图片大小进行判断,如果长宽不为16的整数,倍则进行像素扩展;将处理后的fenc区域数据放入next区域。之后,如果存在B帧,则从next区域中取出B帧以后的P帧放到current区域中,也就是说先编码I、P帧再编码其间的B帧;否则,则直接从next区域取出一帧存入current区域。此时,current区域中存放的就是已经过预处理的即将要编
2018-11-12 23:47:52
接着,将pic_in中的图片数据拷贝到fenc所指向的空间,并在拷贝完成后对图片大小进行判断,如果长宽不为16的整数,倍则进行像素扩展;将处理后的fenc区域数据放入next区域。之后,如果存在B帧,则从next区域中取出B帧以后的P帧放到current区域中,也就是说先编码I、P帧再编码其间的B帧;否则,则直接从next区域取出一帧存入current区域。此时,current区域中存放的就是已经过预处理的即将要编码的帧数据了。
2018-11-12 23:56:19
最后,由于fenc区域是编码的直接对象,再将current区域中的内容拷贝到fenc中正式开始编码。
2018-11-15 09:55:33
编码器在进行预测编码之前必须得到周围块的相关信息,通过x264_macroblock_cache_load()函数将相关数据载入缓存
2018-11-15 09:55:49
然后,利用x264_macroblock_analyse()函数分析参数,确定最佳编码模式即宏块模式抉择
2018-11-15 09:56:51
P帧的帧间预测模式从16×16、16×8、8×16、8×8、8×4、4×8、4×4等以SAD值决定宏块的最佳编码模式。
2018-11-15 10:40:57
在检测16×8和8×16模式后。x264编码器在帧间模式选择后,使用x264_me_refine_qpel( h, &analysis.l0.me16x16 ),对当前最佳模式进行亚像素(分数像素)精细搜索。以进一步减少误差。
2018-11-15 10:49:17
P帧模式的最后选择。先初始化为Intra类型的16×16,记录代价值。然后分别比较Intra块的8×8、4×4,得到当前最佳。最后比较Inter块和Intra块的代价值,即帧内代价与帧间代价做比较,得到最佳编码模式及其代价值。
2018-11-15 11:52:42
搜索每个参考帧读到时间预测向量mvp,通过对参考块的预测得到邻块的MV、前一帧对应位置的MV
注 | 这些都是候选运动矢量 |
2018-11-15 12:01:27
严格按照编码框架中规定的DCT变换、Zigzag扫描和熵编码的过程,以先亮度块再色度块的顺序进行。需要说明的是编码器过程对DC参数和AC参数的处理是分开进行的:首先对整个宏块进行DCT变换,然后将亮度块和色度块的DC参数抽出分别组成4×4和2×2的子块并对剩余AC参数进行量化扫描,接着对DC子块再进行Hadmard变换、量化、Zigzag扫描、反变换、反量化,再对剩下的AC参数进行反量化,最后将处理后的DC子块和AC子块重新组合并对组合后的宏块进行IDCT变换
2018-11-15 12:06:35
CBP(Coded Block Pattern)信息。CBP一共6bit,用于表示当前宏块是否存在非零值,主要用于决定熵编码时采用的码表。
2018-11-15 12:06:47
熵编码实质是查表编码。
多看笔记 来自多看阅读 for iOS