[SilkyBible] XviD系列-19

 
引用 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 的特性比较。
引用 02-04-2004还是转贴 ^^;;
==
H.263 量化的成绩
代码 (双击代码复制到粘贴板)
rc2(cap2~5) 07/10/10 file size: 37,316,608 bytes
                   PSNR:   41.9395   46.0286   55.6601
           Overall PSNR:   45.5088

h.263 q=2 37,570,560
                   PSNR:   43.7765   46.5863   53.5492
           Overall PSNR:   46.2687

h.263 2-pass 38,410,240
                   PSNR:   41.3523   46.6161   53.6435
           Overall PSNR:   46.2146

h.263 2-pass 07/10/10 38,461,440
                   PSNR:   41.6158   46.6646   53.6541
           Overall PSNR:   46.2980

h.263(c) <07/10/10> 38,465,536
                   PSNR:   41.6412   46.6019   53.5581
           Overall PSNR:   46.2695
H.263 量化都有开启 Trellis quantization
q=2 是用固定 quantizer 2 压缩。
2-pass 是以 q=2 的文件大小为目标,做 2-pass 压缩。
2-pass 07/10/10 是将 2-pass 的 Overflow control 设定改为 07/10/10。
h.263(c) 是加上开启 Cartoon mode。

结论
1. H.263 量化的 PSNR 高于 MPEG。
2. 2-pass 压缩没有限制 quantizer 的范围,压出来 quantizer 分布 1~3,由于会用到 quant=3,所以总误差升高,Overall PSNR 降低,最低 PSNR 下降,但倾向个别画面误差的 Average PSNR 升高,代表多出一些 PSNR 较高的 frame,最高 PSNR 提升了 0.1dB。我们待会再看 PSNR 图表,看 PSNR 的分布是如何改变,使用 2-pass 的分配是否更有效律、更为适当。
3. Cartoon mode 用在 H.263 上似乎没什么帮助,最少在高流量 q=2 的时候是如此,也许 H.263 本来就舍弃细节,用上 Cartoon mode 舍弃更多,所以 PSNR 下降。
4. 根据研究,H.263+Trellis,H.263 量化式会倾向把一些很小的系数舍弃,这也是为什么 H.263 可以削去一些画面上原本就有的噪声,同时看起来细节减少的原因。而 Trellis 似乎会将 H.263 舍弃的一些很小的系数再"捡回来",所以 PSNR 提升。同时 Trellis 会使 DCT 系数的分布符合最有效率的编码方式,所以可以缩小文件大小。PSNR 提升+缩小文件大小,双重利益,所以使用 H.263 建议都开启 Trellis。下面的实验如没有特别注明,H.263 一律都有开启 Trellis。

PSNR 图
screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">
蓝色: rc2(cap2~5) 07/10/10,红色: H.263 q=2,绿色: H.263 2-pass
结论
[省略]

和 DivX 5.1.1 以及 WMV9 比较
代码 (双击代码复制到粘贴板)
h.263 q=2  file size: 37,570,560
                   PSNR:   43.7765   46.5863   53.5492
           Overall PSNR:   46.2687

wmv9 2-pass 39,311,360
                   PSNR:   43.1931   46.2731   53.7098
           Overall PSNR:   45.9394

divx5 q=2 41,187,328
                   PSNR:   43.6626   46.5624   53.5312
           Overall PSNR:   46.2331
我没有刻意把三者的文件大小调成趋近一致,你可以看到 DivX 5.1.1 > WMV9 > XviD,三个文件大小看起来差不多,其实差很多,我把数据改成流量表示
XviD: 3348.380 kbit/s
WMV9: 3503.711 kbit/s
DivX: 3671.294 kbit/s

结论
1. 除了 WMV9 的 PSNR 成绩比较差一点,DivX 和 XviD 的表现则差不多,注意这是不同文件大小下的比较,DivX 的流量比 WMV9 和 XviD 大。

三者的 PSNR 图
screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">
蓝色: XviD,红色: WMV9,绿色: DivX

2. 可以看到,DivX 的曲线和 XviD 几乎完全一样,两者的特性可以说是差不多,压不好的地方两者一起压不好,压得好的地方两者一起压得好,所不同的只是 XviD 可以用更小的文件大小达到和 DivX 相同的 PSNR。
3. WMV9 的 2-pass 分配结果和 XviD 则有明显不同,实际观看时,我不觉得 WMV9 PSNR 低下的地方画面有什么特别重大的瑕疵,最后 WMV9 有一段 PSNR 特低的部分,远远输给其它两个 codec,就是前面说很好压缩,白色背景+黑色标题文字的部分。这一段在开始淡入,文字浮现的地方,WMV9 有比较明显的方格,后面慢慢 zoom in 的部分,文字的锐利度也远不及其它两者,不过整体来说,我觉得三者各有优缺点
a) 细节多寡 XviD > WMV9 > DivX,但是 WMV9 中间有一段 PSNR 特高的地方,细节多于 XviD
b) 锐利度 XviD > DivX > WMV9,WMV9 和 DivX 差不多模糊,但是 WMV9 有几个画面特别模糊
c) 锐利线条周围的斑点瑕疵 WMV9 和 XviD 互有胜负,XviD 后面比较多一点,WMV9 前面比较多一点,DivX 可能是最好的

基本上观察到的画质和 PSNR 曲线趋于一致,只是 WMV9 实际观看时,画质并没有如 PSNR 所显示的那么差,是有差一点,不过还可以接受,而 WMV9 PSNR 高的部分,画质令人印象深刻,扣除掉特别模糊的那几个失败的画面,我觉得 WMV9 不会差 DivX 或 XviD 太多,尤其 WMV9 的文件大小还比 DivX 小一点。
当然,文件大小最小,画质也很平均的 XviD 可以说是最强的,不过 XviD 后面有部分画面的锐利线条周围有斑点瑕疵较为明显,是为美中不足的地方。

这三者都有一个共通点,那就是压缩出来的画面比原始画面模糊,XviD 虽然没有另外两者那么糊,但是还是模糊许多。
为了让画面锐利一点,我们试试看用方法一:使用 MPEG quantization。
前面试过 rc2,这里再介绍其它几个 MPEG Matrix
rc2x matrix
intra
08 16 17 22 26 26 27 34
16 16 22 24 26 27 34 35
17 22 26 26 27 34 34 32
22 22 26 26 26 34 35 40
22 26 26 26 32 34 40 48
26 26 26 32 34 40 48 58
26 24 26 34 38 46 56 67
24 26 34 38 46 56 67 81
inter
16 16 16 17 17 18 18 19
16 17 17 17 18 18 19 19
16 17 18 18 18 19 19 20
17 17 18 19 19 19 20 20
17 18 18 19 20 20 20 21
18 18 19 19 20 21 21 21
18 19 19 20 20 21 22 22
19 19 20 20 21 21 22 22

tmpg+rc2x 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 16 16 17 17 18 18 19
16 17 17 17 18 18 19 19
16 17 18 18 18 19 19 20
17 17 18 19 19 19 20 20
17 18 18 19 20 20 20 21
18 18 19 19 20 21 21 21
18 19 19 20 20 21 22 22
19 19 20 20 21 21 22 22

mpg4+rc2x matrix
intra
08 17 18 19 21 23 25 27
17 18 19 21 23 25 27 28
20 21 22 23 24 26 28 30
21 22 23 24 26 28 30 32
22 23 24 26 28 30 32 35
23 24 26 28 30 32 35 38
25 26 28 30 32 35 38 41
27 28 30 32 35 38 41 45
inter
16 16 16 17 17 18 18 19
16 17 17 17 18 18 19 19
16 17 18 18 18 19 19 20
17 17 18 19 19 19 20 20
17 18 18 19 20 20 20 21
18 18 19 19 20 21 21 21
18 19 19 20 20 21 22 22
19 19 20 20 21 21 22 22

cg' matrix
intra
08 08 10 11 12 12 12 12
08 08 10 11 12 12 12 12
10 10 11 12 14 14 14 14
11 11 12 12 14 14 14 14
12 12 12 12 16 16 16 16
12 12 12 12 16 16 16 16
14 14 14 14 16 16 16 16
14 14 14 14 16 16 16 16
inter
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10

rc2x 是 rc2 的改良,量化数字是 rc2 的两倍,也许比较适合中低流量、一般压片使用。
虽然是 rc2 的两倍,不过画面特性和 rc2 截然不同,rc2x 画面比较锐利一点,同时斑点瑕疵也比 rc2 多。如果目标文件大小低于 H.263 quant=2,相当于 H.263 quant=1.8x 的品质附近,rc2x 压出来的视觉品质是不如 rc2 的,这点请注意。

tmpg+rc2x 就是左边 intra 用 TMPGEnc 的预设矩阵,右边 inter 用 rc2x 设计的 inter。这个画面如同原本的预设矩阵,非常锐利,而且斑点瑕疵较原本少一点。

mpg4+rc2x,一样是左边用 MPEG-4 的标准矩阵,右边 rc2x 设计的矩阵。特性也和原本的 MPEG-4 标准矩阵一样,线条的轮廓明显,细节很多,而且斑点的瑕疵也较原本少一点。

cg' 是改良自 CG/Animation 矩阵,顾名思义,是适合用于 CG/Animation 素材的量化矩阵,你可以看到它的 inter 特别设计全部除以相同的数字。cg' 矩阵的特性非常类似 H.263,会产生的压缩瑕疵也和 H.263 一样,它的画面不如其它 MPEG Matrix 锐利,但是杂点瑕疵非常少,可以把它视为是 MPEG 量化中的 H.263 版(不过还是不如真正的 H.263)。cg' 矩阵也适用在比较高的流量,流量太低用 cg' 矩阵品质会下降得很厉害,这点请注意。

四个矩阵的比较
代码 (双击代码复制到粘贴板)
rc2
                   PSNR:   40.7472   45.9377   60.3924
           Overall PSNR:   45.3663

rc2x
                   PSNR:   41.6595   46.1339   53.7940
           Overall PSNR:   45.6523

rc2x(c)
                   PSNR:   41.4054   46.1037   53.7474
           Overall PSNR:   45.6825

rc2x(ct)
                   PSNR:   41.1631   46.1394   53.2665
           Overall PSNR:   45.6772

mpg4
                   PSNR:   41.0728   46.0181   53.6066
           Overall PSNR:   45.5754

mpg4+rc2x
                   PSNR:   41.5146   46.1251   53.7342
           Overall PSNR:   45.6447

tmpg
                   PSNR:   40.9196   46.0248   53.6936
           Overall PSNR:   45.5875

tmpg+rc2x
                   PSNR:   41.4791   46.1352   53.7801
           Overall PSNR:   45.6563

tmpg+rc2(c)
                   PSNR:   41.3940   46.1004   53.6622
           Overall PSNR:   45.6806

tmpg+rc2x(ct)
                   PSNR:   41.1189   46.1330   53.2673
           Overall PSNR:   45.6683

cg
                   PSNR:   41.8770   46.1384   53.7799
           Overall PSNR:   45.6517

cg'
                   PSNR:   41.7845   46.2172   58.2629
           Overall PSNR:   45.7422
矩阵(c) 的意思是加上 Cartoon mode。
矩阵(ct) 的意思是 Cartoon mode+Trellis。

结论
1. 嗯,cg 矩阵果然无敌,这种讯源用单一 quantiser 确实是王道 :P
2. 根据研究,MPEG+Trellis 有时反而会增大文件大小,同时 PSNR 几乎都是下降。这是因为 Trellis 看起来似乎会将 MPEG 量化保留下来的细节再度丢掉,所以 PSNR 狂降。(Trellis 的原理是改变系数的位置,skip 或者移动一些系数,使系数的分布符合最有效率的 RLC+VLC 编码,详细以前说过,此处不再赘述)
建议使用 MPEG 量化不要开启 Trellis。以下的实验如无特别注明,MPEG 一律关闭 Trellis。
3. MPEG 量化开启 Cartoon mode,舍弃一些噪声(可能是压缩中 MPEG 量化自己产生的噪声),画质反而进步。这点和 H.263 不同,H.263 开启 Cartoon mode 帮助不大,成绩反而倒退。
4. Cartoon mode+Trellis 是一个很有趣的组合,不知道 Trellis 会不会把 Cartoon mode 丢掉的信息再捡回来 :P 我只有做了这一个讯源的测试,在这个讯源上使用 (ct) 看不出有特别的压缩瑕疵,有一点明显的帮助是 MPEG 量化的杂点减少了。不过在其它讯源上 Cartoon mode 可能会产生重大的瑕疵,我以前有经历过,所以建议自己做测试,看看到底适不适用。
有机会我会再多做一些实验确认。

四个矩阵的 PSNR 曲线分布
[省略]

其它一堆杂七杂八的矩阵测试
代码 (双击代码复制到粘贴板)
hvs+rc2x
                   PSNR:   41.3301   46.1071   53.6589
           Overall PSNR:   45.6190

hvs-good
                   PSNR:   40.9780   45.9707   53.4037
           Overall PSNR:   45.5526

hvs-better
                   PSNR:   40.5625   45.9697   53.6067
           Overall PSNR:   45.5488
hvs-good 和 hvs-better 是某人设计的矩阵,其中 hvs 的 intra 据说是来自 IEEE 的某一篇 paper,是人眼感知上,失真最少的矩阵。hvs-good 和 better 是这个 intra 加上自行设计的 inter,高频砍得很多的 inter。
测出来的 PSNR 成绩难看,不过实际上看的时候并不会太糟糕 ^^; 还有一个同系列的 hvs-best 矩阵,不过我测完前两个矩阵后面的就无力测试。(hvs-bset 矩阵的成绩应该会比 good 糟糕,intra 和 inter 的搭配不好)
也许 hvs 系列不适合用在这个讯源上。
另外还有 Selur's Matrix,压完以后看了一下也无力测试 PSNR,所以没有列它的数据。
其它常用的 MPEG 矩阵我就没有测试了,我想应该差异不大,MPEG 压出来大概就是这个样子,杂点很多(除了 cg 系的矩阵),这点是完全比不过 H.263。
当然在细节和锐利度上面,MPEG 是优于 H.263 的。

下面是范例图:
噪声
原始画面
http://net1999.net/silky/576-original.bmp
H.263 压缩后
http://net1999.net/silky/576-h.263-blur.bmp
MPEG tmpg+rc2x matrix 压缩后
http://net1999.net/silky/576-tmpg+rc2x-noise.bmp
MPEG cg' matrix
http://net1999.net/silky/576-cg'.bmp
把图抓下来切换着看。原始画面就有一些噪声,H.263 会削去这些噪声,MPEG 压缩画面锐利一点,但是噪声变得更多,这些噪声观看的时候会随时间不停闪烁,所以非常明显。

噪声(Mosquito)
原始画面
http://net1999.net/silky/2120-original.bmp
H.263 压缩后
http://net1999.net/silky/2120-h.263-clear.bmp
MPEG tmpg+rc2x matrix 压缩后
http://net1999.net/silky/2120-tmpg+rc2x-mosquito.bmp
MPEG cg' matrix
http://net1999.net/silky/2120-cg'-mosquito.bmp
锐利线条周围的斑点瑕疵,不用说,还是 H.263 胜出。另外,原始画面脸上有许多杂点都被 H.263 削去,变得很干净。

细节
原始画面
http://net1999.net/silky/1860-original.bmp
H.263 压缩后
http://net1999.net/silky/1860-h.263-blur.bmp
MPEG tmpg+rc2x matrix 压缩后
http://net1999.net/silky/1860-tmpg+rc2x-detail.bmp
MPEG cg' matrix
http://net1999.net/silky/1860-cg'.bmp
如图所示,不用多说 screen.width-500)this.style.width=screen.width-500;" onclick="javascript:window.open(this.src);">

骚动感
原始画面
http://net1999.net/silky/original-1576.bmp http://net1999.net/silky/original-1577.bmp
H.263 压缩后
http://net1999.net/silky/h.263-1576-stable.bmp http://net1999.net/silky/h.263-1577-stable.bmp
MPEG tmpg+rc2x matrix 压缩后
http://net1999.net/silky/tmpg+rc2x-1576.bmp http://net1999.net/silky/tmpg+rc2x-1577.bmp

这两张画面是在一处溶接的场景直后的连续画面,由于是溶接的关系(由一个场景慢慢溶入另一个场景作镜头的转换衔接),并没有引发 codec 的 scene change 插入 I- frame,但是这里的变动还是很大,这两张画面就是跟在这个溶接的场景之后,慢慢进入稳定的画面。H.263 在这两张前后画面的变动度不大,两张画面看起来都差不多,而 MPEG 则有非常大的差异,前面一张和 H.263 一样很糊,后面一张开始把细节慢慢补回来,这样看的时候前后会突然有一个很大的差异,会觉得画面有一种骚动感。
这个现象跟 MPEG 用 2-pass,会切换不同的 quantizer 也有关系,不过 H.263 在先天上稳定度就比 MPEG 来得好,因为它会「稳定的」把噪声(细节)舍弃 :P


下次继续测试其它动画,看看不同类型的动画会带来什么不同的结果,还有 XviD H.263 和 DivX、WMV9 在同文件大小下,PSNR 会差多少,以及增加锐利度的方法二。

你可能感兴趣的:(video)