引用
02-04-2004关于 XviD 的 MPEG quantization,我之前有写一篇针对动画讯源,MPEG quantization vs. H.263 quantization 的报告,里面有顺便提及 XviD, DivX, WMV9 的特性比较,转过来做为提供一点数据左证
==
关于 rc2 matrix
H.263 quantization 和 MPEG quantization 的不同,在于 H.263 使用单一的 quantiser,对于 8x8 block 内的系数,全部除以同一个量化数字,而 MPEG quantization 则是引入了 Human Visual System(HVS) 的观念,认为人眼对于高频的失真比较不敏锐,所以对于高频的系数用比较大的量化数字去除,越大的量化数字代表量化间距越大,量化的结果越粗糙、越不精确,量化的失真(噪声)也越严重。
由于一般自然影像的 DCT 系数的高频系数能量通常很小,也就是数字很小,所以一被很大的量化数字去除以后,高频的成分就会被量化成为 0,也就是这个影像的部分高频成分会被完全删除,作用相当于 filter,所以不同的量化矩阵会带来不同的视觉效果。
也许是因为 MPEG 量化是以 HVS 为导向的关系,又或者是 H.263 量化方式的失真真的小于 MPEG,我所做出来的测试结果,比较 PSNR,H.263 量化方式成绩远远优于 MPEG。
HVS 的观点是,虽然同样是失真,但是人眼对不同种类的失真敏感度不同,同样的 PSNR 数值低下,有的造成的失真很明显,一下就可以被人眼察觉,有的失真却不明显,即使有失真却看不出来。
所以引入 HVS 观念的 MPEG 量化,对于每个 DCT 系数除以不同的量化数字,人眼比较敏感的低频(量化矩阵的左上角)的失真小,越高频(往右下角)的失真越大,所以 MPEG 量化的 PSNR 虽然不如 H.263,但是实际观看时失真不一定比 H.263 明显。
所以我们知道,PSNR 数字有时候无法实际反应人眼实际观察的结果,但是我所做的测试是高流量,也就是以 H.263 quantizer 2 压出来的文件大小为目标大小,quantizer 2 算是相当高的品质,根据 Video Quality Experts Group(VQEG) 小组的实验报告,MPEG-2 在流量大于 8000kbit 之后,没有其它任何一种测试法和视觉品质的相关性大于 PSNR,也就是在高流量 PSNR 是最可靠的视讯品质评量法。
所以我认为 MPEG 量化在这种情况下 PSNR 还是输 H.263,代表了相当程度的证明 MPEG 量化确实不如 H.263。
不过以上只是概略的说法,我们知道最适当的量化矩阵会随着讯源的噪声程度(高频能量的多寡)、讯源的画面结构(材质)特性而做变化,我所做的测试目前都是动画,我们知道动画类型的影片用单一的 quantiser 量化是王道的做法
![]()
screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);"> 用这种方式量化通常会得到最好的 PSNR,所以 H.263 量化在这种讯源上先天就占有优势,虽然 MPEG 量化在动画上不如 H.263,也许在实摄的讯源上、自然影像上面就会赢过 H.263 也说不一定。
关于 H.263 vs. MPEG,有几篇 paper 从量化原理分析,推算两者的量化误差分布,做数值统计,若要深入研究,可以看这些真的严谨考证的 paper
![]()
screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">
一般我们对这两种量化方式的优缺点,感觉是
H.263
优点
1. 画面稳定,骚动感极低,噪声极少
缺点
1. 细节较少
2. 画面稍微模糊
3. 容易出现色块,暗部画面溃烂
MPEG
优点
1. 细节较多
2. 画面较锐利
3. 不容易出现色块
缺点
1. 画面较不稳定,杂点较多,有骚动感
两种量化的优缺点正是相反
![]()
screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">
在动画上,比较少细节,大部分是大片纯色、均匀的材质,以及对比很高,非常锐利的线条。
这种讯源用 MPEG 量化,只要 MPEG 的高频砍得比较多,锐利线条的周围就会出现一直在闪烁的杂点,在观看时这些杂点非常令人讨厌,所以 MPEG 量化用在动画上会给人噪声很多,画面很脏的感觉。
这种杂点根据理论,只要观看时距离屏幕保持较远的距离(空间频率),就会看不见,而 MPEG 的优点「锐利」则会表现出来,H.263 的缺点「模糊」和「色块」即使距离拉远还是看得到,这时 MPEG 的整体视觉品质就会优于 H.263。
例如是茂盛的花草树木的这种画面,在花草树叶非常密集、非常细的地方,这种结构性的材质具有很多高频成分,这些高频的量化失真,即使失真得很严重,我们距离一远,就完全看不出来。
对于太复杂的花纹样式,趋近噪声,即使量化失真后造成噪声,对人眼来说都是差不多,我们无法分辨这些噪声的类型,感知起来都是差不多,一样「乱」
![]()
screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">
然而这招用在动画上则是行不通,由于对比很高(差异大),线条周围的纯色背景出现这种杂点,会非常明显,即使距离拉远,还是可以看到。
所以 MPEG 量化对于动画,可以说是非常不利。
rc2 矩阵是一个高频砍得比较少的矩阵,和 MPEG-2 TM5(Test Model 5) 用的矩阵,也就是 TMPGEnc 的预设矩阵比较起来,他的杂点瑕疵会比较少,但是同时画面会没有那么锐利。
rc2 matrix
intra
08 08 09 11 13 13 14 17
08 08 11 12 13 14 17 18
09 11 13 13 14 17 17 16
11 11 13 13 13 17 18 20
11 13 13 13 16 17 20 24
13 13 13 16 17 20 24 29
13 12 13 17 19 23 28 34
12 13 17 19 23 28 34 41
inter
08 08 08 09 09 09 09 10
08 08 09 09 09 09 10 10
08 09 09 09 09 10 10 10
09 09 09 09 10 10 10 10
09 09 09 10 10 10 10 11
09 09 10 10 10 10 11 11
09 10 10 10 10 11 11 11
10 10 10 10 11 11 11 11
TM5 Default matrix
intra
08 16 19 22 26 27 29 34
16 16 22 24 27 29 34 37
19 22 26 27 29 34 34 38
22 22 26 27 29 34 37 40
22 26 27 29 32 35 40 48
26 27 29 32 35 40 48 58
26 27 29 34 38 46 56 69
27 29 35 38 46 56 69 83
inter
16 17 18 19 20 21 22 23
17 18 19 20 21 22 23 24
18 19 20 21 22 23 24 25
19 20 21 22 23 24 26 27
20 21 22 23 25 26 27 28
21 22 23 24 26 27 28 30
22 23 24 26 27 28 30 31
23 24 25 27 28 30 31 33
rc2 矩阵的另一个不利点,是他的品质太高,量化矩阵的数字太小,压缩时要缩小文件大小,会提高 quantizer,所以用 rc2 压缩会出现很大的 quantizer,如果 encoder 的 2-pass control 做得不好,会出现急遽劣化的
frame。
这在 MPEG-4 上会造成其它麻烦。由于 MPEG-4 的 intra DC 和 MPEG-2 不一样,不是除一个固定值,MPEG-2 的 DC Precision 如果设为 10bit,DC 系数(8x8 block 中最左上角的系数)会固定除以二。
==
8bit 的 pixel value 经过 DCT 转换会变成 12bit 的 DCT 系数,clip 到 -2048~+2047,也就是 11bit 所能包含的数值范围之后,根据 DC Precision 除以固定的数值。
DC Precision 11bit --> 除以一
DC Precision 10bit --> 除以二 (2^11 / 2 = 2^10 = 10bit)
DC Precision 09bit --> 除以四 (2^11 / 2^2 = 2^9 = 9bit)
DC Precision 08bit --> 除以八
==
MPEG-4 则不同。目前实作的 MPEG-4 codec,intra DC 精度最高只能为 8bit,而 MPEG-4 设计为了更适于低流量,intra DC 的精度并不是一个固定值,而是会随 quantizer 做变动,变化是一个 non-linear 的 scale(非线性的放大)
代码 (双击代码复制到粘贴板)
quantizer_scale(Qp): 1~4 5~8 9~24 25~31
dc_scale Y : 8 2Qp Qp+8 2Qp-16
dc_scale C : 8 (Qp+13)/2 同左 Qp-6
由上表,当 quantizer=7 的时候,intra DC 会除以 2*7=14,quantizer=8 的时候,intra DC 会除以 2*8=16,quantizer=9 的时候,intra DC 会除以 9+8=17。
所以 rc2 矩阵用在 MPEG-2 上,效果和用在 MPEG-4 上不同。
注意 intra DC 是 intra-block 的 DC 系数,不包含 inter-block,inter-block 遵照 inter 矩阵中指定的量化数字。
intra-block 不是只出现在 I-
frame 中,在 P-
frame 中如果搜寻不到适当的参考对象,该 Macroblock 也会用 intra-block 压缩(独立压缩,不参考其它画面)。
所以 rc2 矩阵用在 MPEG-4 上,要特别注意 quantizer 的分布。
根据我的测试,rc2 矩阵如果 quantizer 分散太广,品质会下降,不如 quantizer 集中在少数几个 quantizer 上。也就是 rc2 矩阵在趋近 constant quantizer 的时候,压缩品质较好。
下面是用「魔法使的条件」这部动画的 NCOP 做测试,得出来的数据
代码 (双击代码复制到粘贴板)
PSNR: 40.7472 45.9377 60.3924
Overall PSNR: 45.3663
rc2(cap2~5)
PSNR: 41.9396 45.9420 55.6601
Overall PSNR: 45.4078
rc2(cap2~5) 07/10/10
PSNR: 41.9395 46.0286 55.6601
Overall PSNR: 45.5088
XviD RC1 压缩,VHQ=4,只用 P-
frame,自订矩阵,其它都用默认值,目标文件大小是 H.263 quantizer=2 压出来的大小。
rc2 2-pass 压出来 quantizer 分布 1~7,平均 quantizer 4.25,重新压缩做 3-pass,限制 quantizer 范围(cap quant)为 2~5。
第一排的 PSNR 是 Average PSNR,每个画面算出 PSNR 之后平均,bias 偏向画面的个别误差,易受单一极高 PSNR 画面的影响,可以观察 codec 的 2-pass 控制。
第二排的 Overall PSNR,将所有画面的误差累加之后计算总 PSNR,bias 偏向整体的误差量。
可以看出 cap quant 的结果优于 2-pass。
07/10/10 的版本,是把 2-pass 的 Overflow control 的三个参数由默认值 5/5/5 改为 7/10/10,根据测试,这样的效果较好。
三个文件的 quantizer 分布
代码 (双击代码复制到粘贴板)
rc2
quant=1&2: 116 4.4%
quant=3: 479 18.0%
quant=4: 892 33.5%
quant=5: 995 37.3%
quant=6: 177 6.6%
quant=7: 6 0.2%
avg. quant=4.25
rc2(cap quant)
quant=2: 112 4.2%
quant=3: 461 17.3%
quant=4: 796 29.9%
quant=5: 1296 48.6%
avg. quant=4.234
rc2(cap quant) 07/10/10
quant=2: 90 3.4%
quant=3: 495 18.6%
quant=4: 1032 38.7%
quant=5: 1048 39.3%
avg. quant=4.145
提高 Overflow control 的 improvement 和 degradation 会压缩 quantizer 范围(quant=2 和 quant=5 的比例减少,往中间集中)。
这里要说明几点
1. 相同 quantizer 不代表相同品质。
假如画面是静态画面,或者动态不大,前后
frame 的差异极小,也就是动作搜寻能够非常有效的找到极接近的参考对象,这时 1,2,3 三张画面都用 quantizer 2 压缩,和第一张画面用 quant 1,第二张用 quant 3,第三张用 quant 2 压缩,虽然两种做法平均 quantizer 都等于 2,但是品质会不相同。
就是光比较第三张画面,同样是 quant 2 压缩,由于参考的对象前面第一张和第二张画面不同,所以即使第三张同样是 quant 2,品质也不会相同。
2. 有时候,第一张画面用 quant 1 压缩,品质会非常好,如果后面画面和它差异不大,会非常好压缩,此时第二张用 quant 3 压缩,虽然 quant 是 3,但是误差并不会太大,可能比都用 quant 2 压缩还好。
这点就是说,完全固定 quantizer 压缩,品质不一定是最好的,有时候分散 quantizer,少数优良的低 quant 画面会帮助后面的画面压缩,整体品质反而提高。
3. 但是分散太开,也有品质劣化之虞,所以适中的 quantizer 分布会得到最好的压缩结果。
2-pass 的目的就是要达到较为固定的品质,适当地分配流量,给需要的画面分配适当的 quantizer。
所以我们来看看不同 2-pass 设定 PSNR 分布的情形,下面是 PSNR 变化图,纵轴是 PSNR,横轴是时间,也就是
frame,每个数值点的 PSNR 是每 3 张
frame 平均一次,等于 1/10 秒的 PSNR 数值,应该足够细
[省略]
如果不太好看,下面是 30 张
frame 平均一次的图形
screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">
观察 PSNR 变化图,对应单一时间点的 PSNR,会比最后的 Overall PSNR 数字,更符合瞬时的视觉感受。
07/10/10 的 PSNR,最低 PSNR 提升,最高 PSNR 下降,PSNR 曲线压缩,上下震荡的幅度缩小,变得比较接近直线,也就是比较固定的 PSNR 品质。
那么我们要观察的重点就是,PSNR 提升的部分,是否是真的需要提升的画面,提升之后差异有没有明显,原本的压缩瑕疵有没有减少。而最高 PSNR 降低的部分,是否是不需要那么高 PSNR 的部分,降低之后对画面也没有太大的影响。
最后就是观察 PSNR 数据和实际画面看到的压缩瑕疵,两者是否一致,是否有些画面 PSNR 很低,但是肉眼看不出来。
由于这要和影片的画面作对比,才能观察出来,需要很多张图,我这里简化,直接用文字说明结果。
07/10/10 PSNR 降低的部分,是一个很好压缩的部分,全白的背景加上 zoom in 的黑色文字,很好压,所以 PSNR 才会那么高。这里 PSNR 稍微降低一点,虽然还是看得出来(我),但是可以接受,影响算是不大。而 PSNR 提升的部分,都是很好观察到的画面,PSNR 的提升也符合视觉感受,和观察到的画质一致,有明显的进步。
(图的宽度和 Media Player Classic or 6.4 播放 640x480 AVI 时的宽度相同,如果您有 AVI,用 ACDSee 开启这张图,重迭在上面,播放,这样会可以知道该 PSNR 点对应的是哪一个画面)
由实际的观察发现,rc2 矩阵虽然杂点已经比较少了,但是还是有,而且由于 quantizer 较高,画面很不稳定,也就是有骚动感,而锐利线条周围的噪声还是在,同时画面没有非常锐利。
rc2 矩阵看来适用在极高流量的时候,可能要比 H.263 quantizer 2 更高的时候,画质才会较好,而我们一般压片的时候 quantizer 都在 3~4 之间,用 rc2 会非常不适宜。
下次我们将会比较 H.263 的 PSNR,其它改良的 MPEG 矩阵,还有 XviD, WMV9, DivX 5.1.1 的特性比较。