Xvid技术中的精彩部分

Quarter Pel = Quarter Pixel = 1/4 Pixel = QPel:
MPEG 压缩的时候,P-Frame 会参考前一个画面压缩,B-Frame 会参考前面或后面,或前后的画面压缩。
此时只要纪录和参考画面之间的差异,也就是预测的误差,还有物体移动的方向(动作向量 MV),
不用重新压缩整个画面,所以可以节省很多 bits,达到很高的压缩率。
其中又以 B-Frame 的压缩效率最高,因为 B-Frame 可以同时参考前面和后面的画面,
以前后画面的平均值((前+后)/2)做为参考画面,可以大幅减少预测的误差。
(预测的误差越小,所需花费的纪录误差的 bits 数就越少,档案就越小,压缩效率就越高)
同时 MPEG-4 的 B-VOP 还有第四种预测模式,叫做 Direct Mode,直接拿后面的 P-Frame 的 MV
除以二作为动作向量,省去记录 MV 的空间,也可以达到很高的压缩效率。
如:
I B P
我们可以预测,B 的物体移动必然是介于 I 和 P 之间,所以 B 的 MV 大概会接近 P 的 MV 的一半。
以上是大致的压缩原理,我们回过头来看什么是 QPel。
前面说到 P/B Frame 会在参考画面上寻找最接近的区块,然后记录和这个区块的误差值,
以及相距的方向和位置(MV)。
MPEG 压缩的时候是以 16x16 的方块为单位,称为 MacroBlock(MB),
一个 MB 一个 MB 地搜寻最匹配、误差最小的参考方块在哪里。
(也就是搜寻这个物体移动到哪里)
搜寻会在一定的范围内搜寻,譬如说在周围 32x32 的范围内搜寻,而不会无限制的扩大搜寻下去。
所以当画面上动态很大的时候,物体移动距离较远,超出搜寻范围,或是画面变化的差异太大,
我们就找不到误差很小的参考方块,此时压缩率就会下降,需要较多的 bits 来记录。
很明显的,物体的移动和像素(Pixel)的精确度无关,物体不会按照像素的格子,一格一格的移动,
每次都移动整数的格子点,刚好落在像素上。
所以我们以整数像素的单位做搜寻、比对,显然无法找到最匹配、最相似、误差最小的参考方块。
为了克服这个问题,MPEG-2 压缩的时候,会先将要参考的画面做内插补值(interpolation),
补出像素和像素之间的次像素的数值,如:
A x B
x x x
C x D
像素 A 的值为 11,像素 B 的值为 13,则我们可以预测 A 和 B 之间的次像素 x 的值为 12。
依此类推,补出所有的 x 的数值,也就是 1/2 Pixel 的值,再以此 1/2 Pixel 精确度的画面做为
参考画面,于其上搜寻最近似的参考方块。
这样,我们就可以找到误差更小的参考方块,压缩率就更高,同品质下档案就更小,同容量下品质就更高。
根据测试,使用 1/2 Pixel 精确度的 ME(动作估计),PSNR(Peak Signal to Noise Ratio,讯噪比,
常见的一种客观测试影像品质的方法)可以上升 3~5dB。
而 MPEG-4 用的 Quarter Pixel = 1/4 Pel,就是比 1/2 Pel 更精确,再补出 1/2 像素和像素之间
的 1/4 Pel,以此做为参考画面。理论上 1/4 Pel 可以再提升 PSNR 2~3dB。
AoxoB
ooooo
xoxox
ooooo
CoxoD
o: 1/4 Pel
但是,如果 1/4 Pel 没有良好的实作出来,导致用了 1/4 Pel 也没有找到更好的参考方块,
那么因为 1/4 Pel 所使用的动作向量 MV 需要原本 1/2 Pel 的双倍精度来记录(如:1.5 --> 1.25),
所以压出来的档案反而会变大。(同容量下品质就更差)
早期 XviD 的 QPel 就是没有良好的实作,同时有一些错误,所以对于压缩效率没有助益,
使用之后档案反而更大。
但是现在 XviD 的 QPel 已经修正完毕,完全符合 MPEG-4 的标准规范,同时也达到理论上它的压缩助益。
您可以做一个测试,以同品质压缩(固定 Quantizer),开了 QPel 之后,档案大约会减小 ~3%。
这代表同档案大小下,开 QPel 的品质会比没开 QPel 的品质好。
有了以上这些 MPEG 压缩的基础说明,我补充一下上次提到的几个名词说明:
Chroma ME 这个选项
ME = Motion Estimation 动作估计
在参考画面上搜寻最近似的方块,找出相距的距离和方向 => 动作向量 MV = Motion Vector 的过程叫做 ME。
MC = Motion Compensation 动作补偿
将目前要压缩的方块和找到的参考方块相减,纪录它们之间的误差值,以便在解压缩的时候能够
补上这个误差值,这个过程叫做 MC。
MPEG 压缩的时候将像素分为 YUV 三个平面,一般只在 Y(亮度)的平面上做 ME,搜寻 Y 误差最小的 MV。
而 UV(色度,Chroma)的动作向量则是直接拿 Y 找到的动作向量除以二,作为 UV 的动作向量。
(当 MPEG 以 YUV 4:2:0 记录时,UV 的分辨率只有 Y 的一半,也就是画面大小只有 Y 的一半。
如 Y: 640x480,UV 则只有 320x240。所以动作向量直接拿 Y 除以二,可以得到近似值)
这是因为人眼对 Y 亮度比较敏感,对 C 色度比较不敏感。色度分辨率差一点,人眼也看不出来。
减少 C 所占的空间,给 Y 使用多一点空间,可以在有限的流量大小下,增进视觉看起来的品质。
然而做 ME 的时候偷懒,只精确的求 Y 的 MV,而 C 的 MV 就直接拿 Y 的 MV/2 来使用,
这样虽然可以加快压缩的速度,但是品质也会下降。(C 没有精确的求出误差最小的参考方块,
需要花较多的 bits 纪录,使得压缩率下降)
XviD 现在加入了 Chroma ME 的这个选项,会同时搜寻 Y/C 平面上,误差最小的 MV,
速度会慢一点,但是品质会较好。
尤其是压动画类影片,效果最明显。
为什么动态越大的时候要减少连续 B-Frame 的个数?B-Frame 不是压缩率最高,越多越好吗?
MPEG-1 里面,有三种 Frame 型态:
I-Frame: 不参考其它画面,独立压缩,压缩率最差,需要最多 bits,Frame size 最大。
P-Frame: 参考前一张 I 或 P Frame 压缩,压缩率次之。
B-Frame: 参考前后的 I 或 P Frame 压缩,压缩率最高。B-Frame 不能被其它 Frame 拿来当作参考画面。
B-Frame(在 MPEG-4 里面正确的名称是 B-VOP)的预测模式有四种:
a. Forward 顺向预测,参考前一张画面,记录和前一张画面的差距。
和 P-Frame 的预测方法一样。
b. Backward 逆向预测,参考下一张画面,记录和下一张画面的的差距。
c. Bi-Directionally 双向预测,参考前面和后面两张画面,记录的是
和「前后两张画面的平均值」的差距。也叫做内插预测,压缩率最高。
d. Direct Mode,不搜寻、纪录动作向量,直接由下一张的 P Frame
推导出动作向量。譬如说 I B P,我们可以预测 B 画面的动作必然
是介于 I 和 P 两个画面之间,所以我们可以直接用 P 的 MV/2 作为
B 的动作向量,这样可以省去记录 MV 的空间。
压缩 B-Frame 的时候会从上面几种预测模式中选压出来最小的一个模式来使用。
当把最大 B Frame 的个数设得太多的时候,如果 XviD 的动态 Frame Type 决策
没有好好发挥它的功能,会造成误判,在高动态的地方还是插入过多的 B-frame。
如:
大动态画面
I B B B B P
P 距离参考的 I Frame 太远,误差太大,容量暴增。而第一个 B-frame,因为 I 和 P 的差距
很大,(I+P)/2 两个 Frame 的平均值和 B Frame 的差异还是很大,倒不如只用 I Frame
来预测。此时 B 只参考前一张 I 压缩,等于 P-frame。
中间的 B 参考 (I+P)/2 压缩,因为差异量大,还是无法取得很好的压缩率。
最后一个 B 只参考后面的 P 压缩。
最后这四张 B-frame 都无法取得很好的压缩率,大小都变成和 P 差不多大,
此时如果改成
0 1 2 3 4 5
I P P P P P
反而可以得到更好的压缩率。
(因为 1P 参照 0I,差距小。2P 又可以参照 1P,差距也小。以此类推....)
现在 XviD 的动态分配决策已经比以前好很多,最大 B-frames 个数可以放心设到 4 没有问题。
至于 DivX 5 的 B-frame,最多连续个数只能为 1,只能是 I B P B P B P B... 这种型态,
更别提 XviD 现在使用的先进 I/P/B Frame 分配决策,DivX 5 已经完全比不上 XviD。
最后,关于 XviD 保留的细节比较多的问题。
MPEG 压缩的时候,以每个 16x16 像素方块大小的 MacroBlock 为单位作 ME,然后量化的时候
会切成 4 个 8x8 的 Block(微方块),做一种称为 DCT 的转换。
经过 DCT 转换以后,8x8 方块里的 64 个像素点的 YUV 值,就变成代表空间频率的系数。
人眼对高频比较不敏感,相对的低频的系数就比较重要,所以我们利用量化把高频的系数削掉多一点,
保留比较重要的低频系数,在有限的流量的情况下,可以增进肉眼看起来的品质。
XviD 可以使用两种不同的量化方法(Quantization Type),一种是 H.263,另一种是 MPEG。
H.263 的量化方法,顾名思义,就是使用 H.263 这个压缩规格所使用的量化方法,量化的时候,
8x8 的像素方块内的所有 DCT 系数,全部除以同一个数字。(这个动作就叫做量化)
例如全部都除以 32,如果有一个 DCT 系数为 15,小于 32,经过相除之后,会被量化为 0,
如此便可以省下很多记录的 bits。
当然,除的数字越大,量化的误差也就越大,品质也就越差,但是压缩率会越高,压出来档案会越小。
我们会利用另一个参数来调整量化的误差,控制最后量化的品质和档案的大小,这个参数叫做 Quantizer。
量化的系数会再乘上这个 Quantizer 的倍数,例如原本要除的量化系数是 32,Quantizer 是 2,
对应的放大倍数也是 2,最后真正要除的量化系数就变成 32*2 = 64。
所以 Quantizer 越大,要除的量化系数就越大,量化误差就越大,品质就越差,但是档案也越小。
H.263 的量化方法还规定,相邻的两个 MacroBlock 的 Quantizer 不能相差超过 2。
而另一种 MPEG 的量化方法,高低频系数可以除以不同的量化系数,可以视情况将高频削多一点。
这个 8x8 的量化系数,也就是 Quantize Matrix(量化矩阵)。
XviD 还可以让你自订、编辑这个矩阵的量化系数,你可以依照影片内容、使用码率,自订最适当的量化矩阵。
(量化方法要选 MPEG-Custom,同时更改 Edit Quantizer Matrix... 里面的预设量化矩阵,
目前这个功能无法和 B-Frame 同时共享)
MPEG 的量化方法对相邻的 MB 使用的 Quantizer 差距并没有限制。
根据经验,使用均匀量化矩阵(uniform quantization)的 H.263 量化法,压出来的画面会较模糊。
MPEG 量化方法的画面会比较锐利。(不过锐利线条的周围、物体的边缘,会产生一些噪声)
MS MPEG-4,也就是 DivX 3.11,使用的是 MPEG 的量化方式,所以一直以来,大家的评价都是 MS MPEG-4
的画面比较锐利,保留比较多的细节。
DivX 4, DivX 5 都是使用 H.263 的量化方法,尤其是 DivX 4,画面非常模糊。
虽然表面上看起来压缩瑕疵较少,但是细节都被削光光了。
(可以参考上面 net1999 兄提供的图片)
(DivX 5 其实可以藉由修改 registry 的方法,改成以 MPEG 的量化方式压缩,但是显然有 bug,
压出来的东西惨不忍睹)
XviD 则可以让使用者自行选择要固定使用哪种量化方法,或者是视情况切换量化的方法。
(量化方法选择 Modulated,Quantizer 小于或等于 3 时会使用 MPEG 量化,
大于 3 时使用 H.263 量化。New Modulated HQ 则反过来)
GMC,也就是 S(GMC)-VOP,只有在整个画面上,有大部分的区块都往同一个方向移动时,
才能派上用场。譬如说镜头做 pan(由左往右 或 由右往左 平移)的时候,全体由上往下,
或由下往上移动,以及 zoom in/zoom out(物体放大缩小)的时候,才会使用 S(GMC)-VOP。
(其实还有其他功能,例如变形、旋转的时候,不过目前 DivX 和 XviD 都没有完整的作出这些功能)
使用 GMC 的时候,那个 Frame 会使用 MPEG-4 才有的 Frame Type,叫做 S-VOP。
(因为 MPEG-4 是以物件 Object 为单位压缩,所以叫做 Video Object Plane,VOP,
视讯物件平面。有 I-VOP/P-VOP/B-VOP 和特别的 S-VOP 这几种 VOP)
为了要和 Stripe 做区分,我们又把它叫做 S(GMC)-VOP。
所以要比较 GMC 的使用情形,必须找两个相同的画面,而且是 S(GMC)-VOP
(也就是有使用 GMC 的 VOP),才能看出 GMC 的使用结果。
目前 XviD 的 GMC 只有非常简单的功能,现在使用 Global MC 不会比原来的 Local MC 有效率,
对压缩没有助益,用了之后档案反而会更大(压缩效率更差,同容量下品质更差)。
而且还有一些正确性的问题要修正(要符合 ISO 制订的 MPEG-4 的标准规格,否则便是做错,
压出来的东西将来无法为其他标准的 MPEG-4 decoder 解码),所以不建议使用。
XviD 的编程人员每个人都是学富五车,而且是世界上顶尖的编程高手,
目前Codec中的问题他们不是不知道,而是还在思考解决的方法。
譬如说目前 B-frame 一定要勾选 DX50 B-VOP compatibility,这个 Closed GOV
(等于 MPEG-1/2 的 Closed GOP)的问题开发人员不是不知道,而是很困难解决。
(我们来想的话会觉得很简单。没错,理论上很简单,实作就知道有多困难 )
而且开发人员每个人都还有自己的学业、工作要忙,仅能利用一点的闲余时间
来从事这项编程工作,所以无法说改就改,立刻就解决这些问题。
不过尽管如此,XviD 仍然是目前世界上,品质最好的 MPEG-4 编码软件... 之一
(话不能说得太满,要留一点进步的空间 )

你可能感兴趣的:(vi)