H.264的编解码框架与以前提出的标准如H.261、H.263及MPEG-1/2/4并无显著变化,也是基于混合编码的方案:以运动矢量代表图象序列各帧的运动内容,使用前面已解码帧对其进行运动估计和补偿或使用帧内预测技术,所得的图象参差值要经过变换、量化、熵编码等部分的处理。所以,新标准的性能提升在于各个部分的技术方案的改进及新算法的应用。新标准在提高图象传输的容错性方面做了大量工作,重新定义了适于图像的结构划分。在编码时,图象帧各部分被划分到多个slice结构中去,每个slice都可以被独立解码不受其它部分的影响。Slice由图象最基本的结构——宏块组成,每个宏块包含一个16×16的亮度块和两个8×8的色度块。为进一步提高鲁棒性,整个系统被划分为视频编码层和网络抽象层。视频编码层主要描述要传输的视频数据所承载的视频内容。而网络抽象层则是考虑不同的应用,如视频会议通信、H.32X连续包的视频传输或RTP/UDP/IP的通信。 H.264标准分成三个框架(profile):Baseline、Main及X,代表了针对不同应用的算法集及技术限定。其中,Baseline主要包含了低复杂度、低延时的技术特征;主要是针对交互式的应用;考虑到了恶劣环境下的容错性,Baseline的内容基本都被其它更高级别的profile所包含。而Main profile是针对更高编码效率的应用,如视频广播。X profile 的设计主要针对流媒体的应用,在这一框架中所有容错技术和对比特流的灵活访问及切换技术都将包括其中。 Baseline profile的主要技术特征 ⑴ Baseline的解码器只对I slice及P slice进行操作。对于帧间预测,相比以前的标准,为了更精确的对图象的运动内容进行预测补偿,新标准允许宏块更进一步划分为16×16、16×8、8×16、8×8、8×4、4×8、4×4的子块;运动估计精确到经由6-tap滤波器得到的1/4象素位置;运动矢量由相邻块预测得到,其预测的差值被编码传输。H.264支持多参考帧的预测,规定运动估计使用的参考帧数最多可达15帧,多参考帧的使用大大提高了对图像传输的容错性,抑制了错误在空间和时间上的蔓延。对于所有的slice编码类型,H.264支持两类帧内编码:4x4与16x16编码模式。对于4x4模式,每一个亮度4x4块有8种不同方向上的预测模式及DC预测模式。对于16x16模式,每个16x16亮度块有4种帧内预测模式。而对于宏块的8x8色度采样,采用与亮度16x16几乎相同的预测模式。为了保证slice的编码独立性,帧内预测是不允许跨越slice边界的。对于变换、量化部分。不同于以前标准对预测参差值的变换编码使用DCT变换,H.264使用了简单的整数变换。这种变换与DCT相比压缩性能几乎相同且有许多优势,其核心变换的计算只使用加减、移位运算,避免了精度的损失。对变换参差系数的量化使用了52级步长的量化器,而H.263标准只有31级。量化步长以12.5%递增,量化步长范围的扩大似的编码器能够更灵活和精确的进行控制,在比特率和图象质量之间达到折中。对熵编码部分。对于要传输的量化变换系数,若使用基于上下文的变长编码(CAVLC),它是根据前面已编码传输的量化变换系数值的大小来选择接下来系数编码要使用的变长编码表。由于变长编码表的设计是基于相应的统计条件,所以其性能要优于使用单一变长编码表。而对其它数据如头信息等,使用一种单一的变长编码表(Exp-Golomb code)。新标准仍然使用基于块的预测及重构方式,为了去除由此产生的影响图象主观质量的方块效应,H.264使用了去块效应滤波器。其主要思想是当块边界上两边差较小则使用滤波器使差别“平滑”掉,若边界上图象特征明显就不使用滤波。这样既为减弱“块效应”的影响又避免滤掉图象的客观特征。同时在相同主观质量下使得比特率减少5-10%。另外,对图象数据的组织及传输。在H.264标准中的图象宏块可以灵活的宏块组织顺序(FMO)划分为多个slice group;slice之间是相互独立的可以任意的顺序传输到解码端(ASO)。而且在比特流中slice可以使用重复的方式(RS)传输,这在slice数据出错的情况下可用来进行恢复,增强了图象传输的鲁棒性。同时slice间的相互独立性抑制了错误的空间传播,因此提高了比特流的容错性。 ⑵ Main profile的技术特征 Main profile包含Baseline profile的所有算法并具有额外的技术特征,但它并不支持FMO、ASO及RS等技术。只支持对I、P、B slice的处理操作。在此框架内提出了适配块划分尺寸的变换(ABT)的概念。此概念是针对帧间编码的,其主要思想是将对预测参差进行变换编码的块尺寸与用来进行运动补偿的块尺寸联系起来。这样就尽可能的利用最大的信号长度进行变换编码。但是由于复杂度的原因,进行变换的最大块尺寸被限制在8×8以下。对熵编码部分,为更高效的进行编码,这里使用了基于上下文的算术编码(CABAC)使熵编码的性能进一步提高。相比较CAVLC,在相同图象质量下编码电视信号使用CABAC将会使比特率减少10-15%。另,Main profile不支持多个slice group的划分。 ⑶ 相关的编码问题如何对已提出的预测模式进行选择(mode decision)和使用运动估计策略(ME)历来都视频编码实现的重点研究课题。在H.263标准的实现软件中对模式的选择是简单的基于对阀值的比较。在新标准的测试软件中使用了拉格朗日率失真优化策略,它是基于使用每种图象块尺寸和每种预测模式而产生的参差及其传输的码率。这样,模式选择可以取得优化的率失真性能但这是以提高运算复杂度为代价的。此优化操作是对下面拉各朗日函数的最小化: J = SATD + λ•R 其中,R为对应传输的各部分的比特率;λ为优化参数,其与量化参数有很强的相关性。SATD为经过哈德曼变换的4×4块的预测参差绝对值总和。对于所有帧内、帧间宏块编码模式及多参考帧的选择都通过对拉各朗日函数的最小化来实现。通常,视频标准只是包括解码规范,而模式选择的技术研究是属于编码端的范畴,所以不列在标准之内.
H.264学习笔记一
2.1介绍
视频编码是对一个数字视频信号的编码和解码的过程.这一章讨论了数字图象和视频信号的结构和特征以及对于视频编码来说很重要的一些基本概念,比如采样格式等.数字视频是对于一人自然的视觉场景的从时间和空间上进行采样的表示方式.一个场景是由通过在时间上对于点进行采样来得到帧从而产生的(一种对于在时间上点在整个视频场景中的表示方法)或是一个场(由奇数或偶数行的空间采样组成).采样在一定的时间间隔上(通常是1/25或1/30秒时间间隔)进行重复,从而产生一个可动的视频信号。一般来说,需要三种采样集来表示一个有色的场景。表示数字视频的流行的方法是使用ITU-R 601标准并使用"中间集"。对于一个视觉场景的重建的准确性必须被计算来决定一个视频通信系统的性能,这是一个出了名的困难和极为不准确的过程。主观的测量方法是极耗时间而且它与观察者对于变换的反应程序不同而不同。客观的测量方法实现起来就更简单一些,但是目前还不能与人类实际视觉感完完全全匹配。
2.2 自然视频场景
一个经典的“现实世界”或“自然世界“的视频场景是由多个有各自特征形状,深度,纹理和亮度的物体构成的。视频场景的颜色和明亮度在不同的场景中根据不同程序的光滑度而定。一个与视频处理和压缩相关的经典的自然视频场景包括空间特征(纹理变换,物体的数目和形状,颜色等)和时间特征(物体运动,亮度的变化,视点的移动等)
2.3 捕捉
一个自然视频场景在空间和时间上是连续的。用数字的形式表示一个视频场景包括在空间对实际场景进行采样(通常是通过在视频图形面上用长方形格处理)和时间采样(以一系列以某时间间隔采样得到的静态帧组成)。数字视频就是在数字形式下的一个视频场景的采样的表示方式。每一个时-空采样(像素)用一个数或一组数来表示,用来描述采样点的亮度和色度。
为了得到一个二维的采样图像,摄像头把一个视频场景的二维投影聚焦到传感器上,比如一组电荷耦合装置(CCD)。在带色的图像捕捉过程中,每一个颜色成员都分别被过滤并投影到一组CCD中。
2.3.1 空间采样
一组CCD的输出就是一个模拟的视频信号,一组可以表示一个视频图像的电信号。在时间上对一点进行采样就形成了一个有定值的采样点图像或帧。最常用的采样方法是把采样点置于一个正方形或长方形格中进行操作。然后对于每个格交点处的点进行采样,重建过程就以采样值对应到像素上进行显示。重建图的视觉效果取决于采样点的数量。选择一个粗糙的采样格会得到一个低分辨率的采样图像,而增加采样点的数量就会增加采样图像的分辨率。
2.3.2 时间采样
一个可动的视频图像是通过对信号在周期性的时间间隔上进行快照得到的。重放这一系列的帧会得到一个运动的效果。一个高的时间采样率(帧率)会产生更加平滑的运动但是它就要求有更多的采样要被捕捉并被保存。在10帧每秒之下的帧率有些被用于一些很低码率的视频通信中(因为被传输的数据量非常的小)但是运动却看起来很笨拙而且不自然。在10-20帧每秒是比较经典的低码率视频。在25-30帧每秒进行采样是标准电视信号图象的采样帧率(配合隔行扫描采样来达到更好的运动效果)。50-60帧每秒就可以形成平滑的运动(代价就是帧率太过高,传输和存储的压力大).
2.3.3 帧和场
一个视频信号可以被通过对于一系列帧(渐进采样)或一个序列的隔行扫描的场(隔行扫描采样)来进行采样。在一个隔行扫描采样的视频序列里,一帧的一半的数据是在每个时间采样间隔进行采样的。一个场由奇数个或偶数个扫描线组成,而一个隔行扫描的视频序列包括一系列的视频帧。这种采样方式的优点在于与有相同帧数的同样码率的渐进序列相比,可以在一秒中传输两倍多的场,这样就可以形成更加平滑的运动。比如,一个PAL视频序列由50场/秒的码率组成,在回放过程中,运动可以比与之相同的25帧每秒的用渐进视频序列形成的运动显得更加的平滑。
2.4 颜色空间
大多数数字视频程序都依赖于彩色视频的显示,这样的话,就需要一个来捕捉并表示颜色空间的表示方法。一个单色的图像只需要一个在空间内表示一个像素点的亮度或流明度的值就可以了。但对于颜色图像来说,对于一个像素点至少需要三个数来把颜色信息准确地表示出来。用来表示亮度和颜色的方法叫做颜色空间。
2.4.1 RGB
在RGB颜色空间中,一个带颜色的图象采样是用三个值来表示一个象素点的相对的红,绿和蓝色比(三种光线的主样构成颜色)。任何颜色都可以通过把红,绿和蓝来通过不同的比例相混得到。RGB颜色空间更加适合于捕捉并显示颜色图像。捕捉RGB图像包括过滤出红,绿和蓝色的构成比率,并用一个单独的传感器数组来捕捉。CRT和LCD通过分别对每个像素点的红绿蓝值进行显示来得到各种颜色。从一个通常的观察距离来看,不同的构成部分可以达到颜色上的真实感。
2.4.2 YCbCr
人类视觉系统(HVS)相比亮度来说对于颜色不是那么敏感的。在RGB颜色空间中,三种颜色被平等地看待,并用相同的分辨率存放起来。但是通过把亮度与颜色信息分离,并对亮度值取更高的分辨率可以更有效地表示一个颜色图像。
YCbCr颜色空间和它的变换(通常写为YUV)是一种流行而高效的表示一个颜色图像的方法。Y是亮度值,由R,G,B的加权平均可以得到: Y=krR + kgG + kbB
这里k是加权因子。
颜色信号可以由不同的颜色差别来表示:
Cb = B-Y
Cr = R-Y
Cg = G-Y
对于一个颜色图像的完整的描述由给定Y和三个色差:Cb,Cr,Cg来表示。
目前为止,我们的表示方法好像并不那么好,因为相比RGB表示来说,我们这次用了四个参数。然后Cb+Cr+Cg是一个常数,那么我们只需要两个色度参数就可以了,第三个可以通过其他两个计算出来。在YCbCr空间中,只有Y和Cb,Cr值被传输和存储,而且Cb和Cr的分辨率可以比Y低,因为人类视觉系统对于亮度更加敏感。这就减少了表示图像的数据量。通常的观察情况下,RGB和YCbCr表示的图像看上去没有什么不同。对于色度采用比亮度低的分辨率进行采样是一种简单而有效的压缩办法。
一个RGB图像可以在捕捉之后转换为YCbCr格式用来减少存储和传输负担。在显示图象之前,再转回为RGB.注意没有必要去指明分别的加权值kg(因为kb+kr+kg=1),而且G可以从YCbCr中解压出来,这说明不需要存储和传输Cg参数。
Y = kr R + (1-kb-kr)G + kb B
Cb = 0.5/(1-kb) * (B-Y)
Cr = 0.5/(1-kr) * (R-Y)
R = Y + (1-kr)/0.5 * Cr
G = Y - 2kb(1-kb)/(1-kb-kr) * Cb - 2kr(1-kr)/(1-kb-kr) * Cr
B = Y + (1-kb)/0.5 * Cb
ITU-R的BT.601决议定义了kb=0.114,kr=0.299,那么代换参数就有了如下等式:
Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y )
Cr = 0.713(R - Y )
R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb
2.4.3 YCbCr采样格式
4:4:4采样就是说三种元素Y,Cb,Cr有同样的分辨率,这样的话,在每一个像素点上都对这三种元素进行采样.数字4是指在水平方向上对于各种元素的采样率,比如说,每四个亮度采样点就有四个Cb的Cr采样值.4:4:4采样完整地保留了所有的信息值.4:2:2采样中(有时记为YUY2),色度元素在纵向与亮度值有同样的分辨率,而在横向则是亮度分辨率的一半(4:2:2表示每四个亮度值就有两个Cb和Cr采样.)4:2:2视频用来构造高品质的视频彩色信号.
在流行的4:2:0采样格式中(常记为YV12)Cb和Cr在水平和垂直方向上有Y分辨率的一半.4:2:0有些不同,因为它并不是指在实际采样中使用4:2:0,而是在编码史中定义这种编码方法是用来区别于4:4:4和4:2:2方法的).4:2:0采样被广泛地应用于消费应用中,比如视频会议,数字电视和DVD存储中。因为每个颜色差别元素中包含了四分之一的Y采样元素量,那么4:2:0YCbCr视频需要刚好4:4:4或RGB视频中采样量的一半。
4:2:0采样有时被描述是一个"每像素12位"的方法。这么说的原因可以从对四个像素的采样中看出.使用4:4:4采样,一共要进行12次采样,对每一个Y,Cb和Cr,就需要12*8=96位,平均下来要96/4=24位。使用4:2:0就需要6*8=48位,平均每个像素48/4=12位。
在一个4:2:0隔行扫描的视频序列中,对应于一个完整的视频帧的Y,Cb,Cr采样分配到两个场中。可以得到,隔行扫描的总采样数跟渐进式扫描中使用的采样数目是相同的。
2.5 视频格式
这本书中描述的视频压缩标准可以压缩很多种视频帧格式。实际中,捕捉或转化一个中间格式或一系列中间格式是很平常的事情。CIF就是一种常见的流行的格式,并由它衍生出了4CIF和Sub-QCif。帧分辨率的选择取决于应用程序,可使用的存储量以及传输带宽。比如说4CIF对于标准定义的电视和DVD视频来说是合适的,CIF和QCIF在视频会议中是常被使用的格式。QCIF和SQCIF对于移动设备的多媒体程序来说是合适的,在这样的情况下,显示分辨率和码率都是有限的。以下是各种格式的具体使用位数的需求(使用4:2:0采样,对于每个元素用8个位大小表示):
格式: Sub-QCIF 亮度分辨率: 128*96 每帧使用的位: 147456
格式: QCIF 亮度分辨率: 176*144 每帧使用的位: 304128
格式: CIF 亮度分辨率: 352*288 每帧使用的位: 1216512
格式: 4CIF 亮度分辨率: 704*576 每帧使用的位: 4866048
一种在电视信号中被应用的很广的数字视频信号编码格式就是ITU-R的BT.601-5 提案。亮度元素被在13.5MHz下采样,而亮度值则在6.75MHz下采样,这样就形成了一个4:2;2的Y:Cb:Cr采样结果。采样数字信号的参数取决于视频码率(对于NTSC来说是30Hz,对于PAL/SECAM来说是25Hz)。NTSC的30Hz是对低空间分辨率的补偿,这样总的码率就是216Mbps.实际显示的激活部分的区域要比总量小,因为它去掉了在一帧边缘处的水平和垂直空白间隔。
每一个采样都有0-255的采样范围。0和255两个等级被留作同步,而且激活的亮度信号被限制到26(黑色)到235(白色)之间.
2.6 质量
为了指定,评价和比较视频通信系统,我们需要决定向观察者显示的视频图像的质量。衡量视频信号的质量是一件困难的事情,通常也是不准确的,因为有太多的因素会影响到衡量的结果了。视觉质量与生俱来就是主观的因素,它被很多因素影响着,这就使对于这个衡量结果的准确性变得更难了。比如说,一个视频信号的质量对于一个观察者来说主要取决于任务本身,比如说,被动地观看一部DVD影片,主动地参与一个视频会议,用符号评议进行通信交流,或是试图从一个视频场景中认出一个人。衡量视频信号的客观分类给定了一个准确的可重复的结果,但是没有哪种客观的测量方法可以完全地模拟人类视觉主观的感受。
2.6.1 主观质量测量
2.6.1.1 影响主观质量的因素
对于一个视频场景的感觉是由人类视觉系统对于不同元素复杂交互性决定的----眼睛和大脑.对于视频信号的感知是受空间保真度的影响的(不管有没有明显的失真,问题在于我们是否可以清楚地看到一个场景的各个部分)和时间保真度(运动是否自然平滑)。然而,一个观察者对于质量的看法经常会被观察环境,观察者的心情和观察者与场景的交互程序相关。一个执行特定任务的用户需要关注于视频场景的一部分。观察一个场景常与看一个电影时的对于“好”的概念是不同的。例如,一个观察者的对视频质量的看法在观察环境好的情况下会更好一些(而这一点不取决于视频信号本身的好坏)
其他的重要的影响因素包括视觉焦点(一个观察者通过一系列的观察点而不是同时观察所有的内容)和所谓的"最新效应"(我们对于一个视频序列的看法总是更多地受更新看到的内容的影响而不是老的内容)。所有的这些因素都让衡量一个视频的质量的好坏的任务变得极为困难。
2.6.1.2 ITU-R 500
很多的关于主观质量认下的测试过程都在ITU-R BT.500-11中被定义。一个常用的过程就是Double Stimulus Continuous Quality Scale(DSCQS)方法,评价者被展示了一系列的图片或两个视频序列A和B(一个接一个地),然后被要求给出A和B的质量评价值,方法是在五个分隔着的评价值(从"Excellent"到"Bad")画连续线来定。在一个典型的测试会话中,评价者被展示了一系列的序列,并被要求对它们进行评价。对于每对序列来说,一个是未受损的"参考“序列,另一个是同样的序列,它被在测试的系统或过程中修改了。
这两个序列的顺序,原始的和有损的,在测试地过程中被随机的给出,这样评价者就不知道哪个是原始的,哪个是改变过的序列。这样就防止了评价者带偏见地比交这两个测试序列。在结束的时候,评分被转化到一个规范化的范围内,最终的结果是用平均评价值来说的,用它来指明相应的帧的质量。
像DSCQS这样的测试被广泛地接受,并被用来评价主观的视频效果。然而,这样的测试受实际问题的影响。这样结果对于评价者来说差别会非常大。这个不同会被在重复测试的过程中被弥补过来。一个有经验的评价者(对视频压缩失真了解的比较多的)会比那些非有经验性的用户会给出一个更带偏见的评分。这就意味着一个很大的评价用户群是需要的,因为没有经验的用户很快会发现被改变的视频的一些特征。这些因素使得使用DSCQS方式的代价更大。
2.6.2 客观的质量测量
主观测量质量的方法的复杂性和消耗性让用算法自动测量质量要更加的吸引人。视频压缩的开发者和视频处理系统很大程序上依赖于所谓的客观质量测量方法。最广泛应用的方法是PSNR方法,但是这种方法的局限性使人们不得不找更加复杂的方法来逼近人类视觉性。
2.6.2.1 PSNR
PSNR是用来在对数级上描述质量,并且依赖于原始信号和改变后信号的均方差(MSE):
PSNR(db) = 10log(10)(2^n-1)^2/MSE
PSNR可以很方便而快速地被计算出来,这样它就成为了一种很流行使用的方法,并用来测量压缩和解码视频图像的质量。
PSNR方法有几个局限性,PSNR需要一个原始的图像做为对比,但是这也许是无法在所有情况下都可以实现的,也难保所谓的原始图象没受过影响。PSNR不能准确地给出主观的视频质量值。对于给定的一个图象或一个图象序列来说,高的PSNR通常说明质量高,低PSNR说明质量低。然而,一个特定的PSNR值并不等于绝对的主观的质量。主观上感觉好的图象不一定PSNR值高。这种情况下,人类的观察敏感区中心让人感觉清晰度很好,但信嗓比不一定高。
2.6.2.2 其他的客观质量衡量方法
因为PSNR方法的局限性,最近有很多工作用来开发更加复杂的客观的测试过程,而且表示更准确的主观信息。很多不同的方法都被提出了。但是没有一个可以完全代替主观测试。所以还没有一个比较标准的,准确的,可用的方法。意识到这一点之后,ITU-T视频质量专家组(VQEG)就致力于提出一种客观的视频质量评价机制。每一步就是测试并比较隐藏的模型与测试模型。在2000年三月,VQEG宣布有10个这样的测试系统备选。不幸的是,没有一种被认为是适合的。VQED在2003年进行了第二次的评估。除非非常在自动质量评价中有一个非常大的突破,否则这个问题是很难被解决了。
2.7 结论
采样模拟信号会形成数字视频信号,它有准确,高质量和对于数字媒体的存储传递等各种优势,但是会占用比较在的空间。与生俱来的问题包括空间和时间分辨率,颜色表示和视频质量的测量问题。下一章会介绍视频压缩的一些其他的基本理论.
H.264学习笔记二
3.1 介绍
压缩(compress) 动词: 挤压到更小的空间中;即condense
压缩(conpress) 名词: 压缩的行为或是压缩的状态
压缩是把数据用更小的空间来存放的技术.视频压缩(视频编码)是把数字视频流序列用更少的数据位进行存放的方法."Raw"或叫没压缩过的视频需要大量的码(大约每秒信息216M),而且压缩对于数字视频的存储和传输来说都是需要的.
压缩包括一对互补的系统,一个编码器(encoder)和一个解压器(decoder).编码器把原数据在传输或存放之前转变为压缩格式(占用更少的数据位),而解压器把压缩的格式转会到原来的视频数据格式上.编码器/解码器对经常被叫做CODEC(enCOder/DECoder)
数据压缩是通过移除数据冗余来实现的,比如说,对于数据重构过程中无用的数据。很多种数据都有统计上的冗余性,它们就可以通过无损压缩进行有效的压缩,这样的标准比如说JPEG-LS,它可以达到3-4倍的压缩。有损压缩可以达到更高的压缩比。在有损压缩系统中,解压数据与源码流数据是不同的,高压缩率是通过视频质量的下降来达到的。有损视频压缩系统是建立在删除主观冗余的原理之上的,从图象或视频中删掉的部分不会很大程度上影响观察者对于视频质量的认识的。
大多数视频编码方法寻找空间和时间上的冗余来达到压缩的效果。在时间域中,连续几帧的视频通常有很强的相关性,特别是当时域采样率是非常高的时候尤其如止。在空间域中,通常像素采样点之间是相互关联的,比如说,相邻象素之间很相近。
H.264和MPEG4视频标准共用了一部分特征。这两种标准都假设了一种以块(block)为基础的运动补偿,变换,量化和熵编码。我们主要关注到这些主要的方法中,并从时间模型开始,接下来是图象变换,量化,预测式编码和熵编码。并以对于一个图象采样块进行编码和解码的过程进行描述。
3.2 视频编解码器
一个视频编码器器把一个源图像或视频序列转化为一种压缩模式,并在解码器把它构造为源序列的一个拷贝的或是一个近似.如果解压了的视频序列与原序列是相同的,那么编码过程是无损的,如果解压序列与源序列是不同的,那么这个过程是有损的。
CODEC用一种模型来表示原始视频流(一个被有效编码的表示方式,并可以用它来重建视频数据的近似结果或尽量取得高的码率。这两个目标(压缩效率和高质量)通常是相矛盾的,因为一个低的压缩码率通常在解压部分会降低图象的质量。码率和质量的平衡我们会在之后进行介绍
视频编码器是由三个主要的功能部件实现的:时域模型,空域模型和熵编码。时域模型的输入为一个未压缩的视频流序列。时域模型试图用邻近帧的相似性来消除了时域冗余,通常是构造通当前帧的预测。在MPEG4视频部分和H.264中,预测通常从一个或多个之前或之后的帧来进行的,并通过对于帧之间的差别进行补偿。时域模型的输出是一个剩余帧(通过从实际当前帧中减去预测值得到),而一系列的模型参数,通常是一系列用来描述运动是如何补偿的运动向量。
剩余帧构成了时域模型的输入,它会利用邻近采样点的相似性来降低空域的冗余。在MPEG4视频部分和H.264中,这通常通过一些变换来对样点进行处理来实现。变换把采样点转到其他的域中,在这些域中用变换系数来表示。这些系数被量化来删除不明显的值,只留下很少的大系数来对剩余帧进行表示。空域模型的输出是一系列的量化变换的系数。
时域模型的参数(通常是运动向量)和空域模型的参数(系数)通常用熵编码来进行压缩。这就删除掉了统计上的冗余度(比如,用短二进制码表示当前的向量和系数)并制造出一个压缩流或文件来进行传输或存储。一个压缩的序列由编码的运动向量参数,编码的剩余系数和头信息表示。
视频解吗器从一个压缩流中构造一个视频帧。系数和运动向量由熵解码器进行解码,然后空域模型构建出一个版本的剩余帧。解码器利用运动向量参数与一个或多个解压帧来构成一个对当前帧的预测,然后帧就可以通过加入这个剩余帧来得到。
3.3 时域模型
时域模型的目标是要减少减少传输帧的冗余性。这个过程的输出是一个剩余帧,而且预测过程越准确,剩余帧中包含的能量就越小。剩余帧被编码并送到解压器用来构造预测帧,加上解码的剩余帧来构成当前帧。预测帧是通过一个或多个过去或未来的帧(都叫做参考帧)来创建的。预测的准确性通常可以由参考帧和当前帧之间的运动补偿来改进。
3.3.1 从前一视频帧进行预测
时间域的预测的最简单的方法是从当前帧的前一帧进行预测。用两帧之间的差来做为剩余帧。这个方法的明显的问题在于剩余帧中的能量太多了,这也就是说在时域压缩之后还有大量的数据可以被压缩。大部分的剩余能量是由于在二帧中的物体运动可能造成两帧的运动补偿形成的。
3.3.2 由于运动造成的改变
在视频帧之间的改变可能是由物体的运动造成的(刚性的物体运动,比如说一辆运动着的汽车,或可变形物体运动,比如说移动的手臂),摄象头的移动,被去覆盖的区域(比如说一个运动场景中由于物体的运动致成背景的去覆盖性)和光线的变化。除去去覆盖和光线变化,差别都是由于帧间的像素点的运动造成的。这样构造的像素点的邻接被称为光流(optical flow)。完整的域包括对于每个像素位置的光流向量,但是这些域都是被子采样过的,这样的话,只有每隔两个像素点的向量才被显示出来。
如果光流域是准确描述的,那么它应该可以构成一个对大多数像素点准确的预测,方法即为沿着光流向量移动参考帧中的每个像素点。然而,种种原因之下,这并不是一个实用的运动补偿的方法.对于光流的准确的计算对于计算来说是非常敏感的而且把每个像素点的光流传给解码器也是必要的,以使它能重构造预测帧(这样就得到了大量的传输数据,与我们小剩余值的目标是相矛盾的)。
3.3.3 基于块的运动估计和补偿
一个实用并被广泛使用的运动补偿方法是为了裣一个矩形区域的运动或叫当前帧的“块”。下列的步骤对当前帧的一个M × N采样的块的处理过程:
1. 在参考帧中查找一帧(过去的或以后的,已被编码的或传输的),来找到一个相匹配的M * N的区域。这是由在查找区域中比较M * N的块,并找到一个最接近这一块的区域。一个流行的匹配方式是用把两个块的能量作差,这样能量相差最小的两个区域被认为是最佳的匹配结果。这个查找匹配的过程被叫做运动估计。
2. 选定的区域成为对于当前M * N块的预测块,它被减掉当前的块来构成一个M*N的剩余块(运动补偿).
3. 剩余块被编码并传输,当前块和选定块的差值(运动向量)也被传输.
解码器使用接收到的运动向量来重建预测区域并解压剩余块,加上之前的预测块来重建一个原始块。
基于块的运动补偿这么流行是有很多原因的。它很直接,计算性上也很易处理,它与矩形视频帧很相适应,并且使用基于块的图形变换(比如DCT等),而且它对于视频序列提供了一个有很效的时域模型。然而它也有一些缺点,比如说,实际物体中几乎没有平滑的边缘来进行矩形边界的匹配,物体通常在帧之间用很小的像素点位置移动(比如说可变形的物体,旋转和扭曲),而且很多种运动是难以用基于块的方法进行补偿的。尽管它有这些缺点,基于块的运动补偿是当前所有的视频标准使用的时域模型的基础.
3.3.4 对于一个宏块的运动补偿
宏块,对应于一个16*16的帧区域,是大多数编码标准(包括MPEG1,MPEG2,MPEG4,H.261,H.263和H.264)运动补偿预测方法的基本组成部分。对于源4:2:0的视频信号来说,一个对于源帧的16*16像素区域的是由256个亮度采样(用4个8*8的采样块排列),64个Cb色度采样(用一个8*8的采样块排列),64个Cr色度采样(用一个8*8采样块排列),这样就一共六个8*8的块。MPEG4或H.264的CODEC通过宏块来处理每一个视频帧.
运动估计
对于一个宏块的运动估计包括在参考帧中找一个与当前宏块相近的16*16的采样区域。参考帧是一个在之前被编码过的帧。参考帧的区域以当前宏块的位置为中心,宏块区域的查找16*16的相匹配区域做为最佳匹配结果。
运动补偿
在参考帧中选定的最佳匹配区域是从当前宏块中减掉的部分,它用来构成一个剩余帧,接着通过运动向量被编码和传输,它也描述了最佳对应区域。在编码器之内,剩余帧被编码和解码并被加到相应区域之中,来重构一个宏块,这个宏块被存为以后的运动补偿预测的参考帧。用一个解码的剩余帧来重构宏块来保证编码器和解码器在运动补偿的时候使用相同的参考帧。
在运动估计和补偿的过程中有很多不同方法。参考帧可以是之前的或之后的一帧,也可以是结合或是更多帧的搭配。。如果一个之后的帧用来进行参考的话,那么就要先对这一帧进行编码。在参考帧和当前帧之间有一个很大的改变的地方(比如说,一个场景的变化),也许不使用运动补偿进行编码宏块会更有效。这样编码器就选择帧内编码(在没有运动补偿的情况下进行编码.在移动场景中移动的物体很少符合16*16像素边缘而且这样也许使用可变的块大小进行运动估计和补偿会更高效。物体可能有很少的像素部分运动,这样使用在参考帧中插值法会是一种更加好的预测方法。
3.3.5 运动补偿块大小
视频序列中的连续两帧中图1是从图2中不通过运动补偿而进行减操作得到的一个剩余帧.剩余帧中的能量由于通过16*16的宏块做运动补偿而降低.每8*8块(而不是16*16)的块会更近一步降低剩余帧中的能量,4*4会更少.这个例子说明了小的运动补偿块可以得到更佳的运动补偿效果.然而,一个更小的运动补偿块会导致复杂度的升高(更多的搜索操作被执行了),这样更多的运动向量就要被传输。发送每个运动向量需要一些位来做到,这个多余的负担会抵销剩余帧中能量的减少的优势。一个更有效的妥协的方法是采用调节图的块大小,比如说在相似的区域上选择一个大的块,而在高度细节化运动的部分选用更小的块。H.264使用了一种自适应的运动补偿块大小,在以后我们会提到。
3.3.6 子像素运动补偿
一些情况下,通过在参考帧中从插值采样位置来预测会得到更好的运动补偿预测。“子像素”运动估计和补偿包括寻找子采样的插值位置与整值采样位置,来寻找最佳匹配(比如说,最小化剩余帧的能量)并在这个位置使用整或子采样值来直行运动补偿预测。对于四分之一像素运动裣来说,第一步,运动估计会寻找对于整采样格的最佳匹配,接下来编码器在最佳匹配附近寻找半采样位置来看匹配是否可以被改进,如果需要的话,对半采样最佳匹配像素附近的四分之一采样位置进行寻找。最终的匹配(整,子或四分之一采样位置)由当前块或宏块相差得到。
用4*4的块大小得到的剩余帧可以使用半采样插值并有更低的剩余能量。这种方法可以由从四分之一采样格来得到更小的剩余帧能量得到扩展。总体上说,“更好的”插值可以达到更好的运动补偿性能(更小的剩余帧能量),代价则是复杂度会更高一些。这样得到的性能提升会因为插值的步骤的增多而抵销。半采样插值相比整采样有更好的性能,四分之一采样插值会给出更好的效果,八分之一更胜之,以此类推。
一个运动补偿过的参考帧被从当前帧中减去,剩余帧的能量如下(用总绝对误差来近似SAE):
Sequence No motion compensation Integer-pel Half-pel Quarter-pel
'Violin',QCIF 171945 153475 128320 113744
'Grasses',QCIF 248316 245784 228952 215585
'Carphone',QCIF 102418 73952 56492 47780
一个低的SAE表示更好的运动补偿性能。在每种情况下,子像素运动补偿相对整像素补偿都有更好的性能表现,而四分之一补偿会更好。"Grasses"序列有更复杂的运动,这样就更难以实施运动补偿,悲痛"Violen"和"Carphone"就更容易进行补偿了。
在四分之一采样插值中寻找一个匹配的4*4的块是比在没有插值的16*16的块中更加复杂的。除了更大的复杂度之外,因为每个块的运动向量都要被编码并传输到接收端以更好的重建图象,这样就有了编码上的性能损失了。因为块大小减小了,传输的向量数增加了。需要更多的位来表示半采样或四分之一采样向量,因为向量的更细节部分也必须被像整采样那样进行编码。这样有另复杂运动的补偿模式下就有编码效率上的平衡度了,因为运动补偿越准确,就有更多的数据来表示运动域,但是在不那么准确的情况下,就不需要那么多位了。
3.3.7 基于区域的运动补偿
在一个自然的视频场景中移动的物体很少被对很整齐地对齐到块的边缘,它们很可能是不规则形状的,放置在任意位置上,而且在帧间改变他们的形状。这样就很难在参考帧中找到一个理想的匹配,因为它覆盖了一部分运动着的物体,一部分静态的物体。
在图像的任意区域应用运动补偿是可以达到更好的性能的。比如说,如果我们试图在椭圆形的物体中进行运动补偿的话,我们可以在参考帧中找到一个理想的匹配。然而使用基于区域的运动补偿会遇到很多的实际困难,包括识别区域边界,指出边界的轮廓,在运动补偿之后编码剩余帧,MPEG-4视频包括了一系列的工具来支持基于区域的补偿和编码。