[SilkyBible] XviD系列-7

来源:互联网 发布:手机淘宝可以买火车票 编辑:程序博客网 时间:2024/03/29 04:04
 
引用 04-29-2003关于 XviD 和 DivX5 的比较,我这几天又做了一点实验。
我以前压 XviD 都不用 B-frame,当然也不开 Quarter Pixel 和 GMC,所以和 DivX5 比较的时候,我也不使用 DivX5 的 B-frame 和 Quarter Pixel、GMC 等功能。
今天用新版的 DivX 5.0.5 和 XviD 再做一次比较,同时测试了开启 B-frame 的效果。
结果发现 DivX 5.0.5 蛮强的,比 5.0.2 进步。
(不过产品上市时间相隔了一年,没有进步的话就真该打屁股了 :P )
我只测试了一个 sample,动画 Kiddy Grade 的片头,时间长度一分半钟。
这个影片的色彩很鲜艳,对比强烈,噪声不多,有很多平移画面,淡入淡出的画面,镜头慢慢拉近慢慢拉远的画面,还有一些动态非常激烈的画面,不太好压。
当然,还有动画的锐利线条、无残影等特性。

DivX 使用版本
DivX Pro v5.0.5

XviD 使用版本
1. Nic 编译的版本 30-03-03
Nic 的这一版,有修改 iDCT 的演算法,使用的是 Simple iDCT。
XviD 原本用的 MMX iDCT 演算法是 Intel 的 AP-922,精度似乎不够。
Simple iDCT 是 FFMPEG 用的 iDCT 演算法,据实验有很好的效果。
为了解决 Quarter Pixel 解码,使用不同 iDCT 算式会造成画面颗粒像液体般流动的瑕疵,XviD 打算将 iDCT 的算式改成和 FFMPEG 一样。
这样以后用 ffdshow 来解码有使用 Quarter Pixel 的 XviD 影片,就不会发生水波纹流动的这种瑕疵了。

============== 无关主题,顺便一提 开始 ==============>

播放 Quarter Pixel 的影片时,画面颗粒像液体般流动的瑕疵,其产生的原因:
1) ISO 修改了 Quarter Pixel 的 rounding 方法,旧版的 FFMPEG 没有跟着修改,所以解 XviD 的 Quarter Pixel 时,会发生 rounding 错误,最新版的 ffdshow 已经修正了这个错误。

2) 不同 MPEG-4 Encoder 压缩时采用不同 iDCT 算式,会造成解压缩时 iDCT mismatch 的问题(虽然设计上有防止误差累积的机制)。
由于大家压 MPEG-4 时 I-frame 的间距通常设得很长,误差一直累积,所以 iDCT mismatch 的问题会变得更严重(连续 P-frame 之后画面会逐渐劣化)。
而 Quarter Pixel 似乎更加重了这个问题,使得误差累积的错误更明显。

要避免这个瑕疵,必须
1) 使用 Koepi、Nic 编译的最新版 XviD 来编码,他们两人的版本有修改,使用 Simple iDCT 演算法。
uManiac 编译的版本没有修改。

2) 使用最新版的 ffdshow 来播放,或是使用 XviD 自己来播放。

<============== 无关主题,顺便一提 结束 ==============


2. 自己编译的版本,25-04-03 的 CVS Fresh Check,手动修改了 iDCT 的演算法,使用 fdct_mmx + simple_idct_mmx2 的组合(按照我使用的 CPU 旗标设置。我的 CPU 没有 SSE/SSE2/3DNow!2 指令集,Debug 设定底下还是用自动侦测),根据网友测试,这个组合是 XviD 的 PSNR 品质算出来最高的。

从 Nic 的 03-30,到我编译的 04-25,XviD 修改了:
================================================
25.4.2003 15:00:
U xvidcore/src/motion/motion_est.c (rev.1.67) syskin:
- b-frames look good in still motion, after all

14.4.2003 15:00:
U xvidcore/src/motion/motion_est.c (rev.1.66) syskin:
- "What bug could i invent today ?"

14.4.2003 13:40:
U xvidcore/src/motion/motion_est.c (rev.1.65) syskin:
- improved vhq (does not decrease psnr anymore - at least for low quants) and tweaked p/b/i decision again

9.4.2003 12:20:
U xvidcore/src/encoder.c (rev.1.99) syskin:
- bframe_threshold works again - I didn't know anyone uses it ;>
U vfw/src/codec.c (rev.1.28) syskin:
- bframe_threshold = 0;

8.4.2003 11:40:
U xvidcore/src/encoder.c (rev.1.98) syskin:
- bframe_threshold not supported -> disabled
U xvidcore/src/motion/motion_est.c (rev.1.64) syskin:
- faster; better vhq; bframe-decision changed again
U xvidcore/src/motion/motion_est.h (rev.1.6) syskin:
- faster; better vhq; bframe-decision changed again

5.4.2003 16:20:
U xvidcore/src/motion/motion_est.c (rev.1.63) syskin:
- a bit faster + a small bugfix
U xvidcore/src/motion/motion_est.h (rev.1.5) syskin:
- a bit faster + a small bugfix

5.4.2003 02:40:
U xvidcore/src/global.h (rev.1.22) edgomez:
- Fixes 32 bit misaligned reads on ARM (+ some sync work with old 0.9.x tree for cleanups)
U xvidcore/src/bitstream/bitstream.h (rev.1.18) edgomez:
- Fixes 32 bit misaligned reads on ARM (+ some sync work with old 0.9.x tree for cleanups)

4.4.2003 11:00:
U vfw/src/codec.c (rev.1.27) Isibaar:
- set bframe threshold to 255 by default

4.4.2003 03:40:
U xvidcore/src/encoder.c (rev.1.97) Isibaar:
- CBR + b-frames bugfix
U xvidcore/src/utils/ratecontrol.c (rev.1.20) Isibaar:
- CBR + b-frames bugfix
================================================
引用 04-29-2003测试一: 固定品质 quantizer 2 压缩,压出来文件越小,压缩效率越高。
然而文件小,可能是压缩时舍弃较多系数换来的(会造成画面模糊、细节损失、误差增加、画质下降),所以同时计算 PSNR,测量品质。
PSNR(Peak Signal to Noise Ratio)是和原始影片比较的结果,PSNR 越高,代表和原来的画面接近,品质越高。


DivX 5.0.5 的设定:
1-pass quality-based
Quantizer: 2
不使用 Psychovisual Enhancements
Max Keyframe interval: 132
Scene change threshold: 50%
Performance/quality: Slowest
Encode as Progressive


XviD 的设定:
1 Pass - quantizer: 2
Motion search precision: 6 - Ultra High
Quantization Type: H.263
VHQ mode: 1 - Mode Decision
Maximum I-frame interval: 132
Minimum I-frame interval: 1
不使用 Lumi masking
Use Chroma motion
Chroma Optimizer(pre-filter) <- 这个选项会降低 PSNR,但是可以减少红色部分锯齿的现象

压出来文件大小
DivX 5.0.5: 36,706,304 bytes ( 100%)
XviD Nic's: 33,916,928 bytes (92.4%)
XviD 04-25: 33,153,024 bytes (90.3%)

接下来测定 PSNR,这里要说明一下:
为了公平起见,所有压缩版本的源文件都是统一由 Avisynth 做 RGB -> YV12 的转换,用 VirtualDubMod,直接送 YV12 的数据给 Codec 压缩。Avisynth 的语法是
avisource("Kiddy Grade NCOP_aup_vfapi.avi").ConvertToYV12()

比较的时候,是用这个源文件,和各个压缩的版本比较。
各个压缩版本的 AVI 开启的时候,强制 Codec 输出 YV12 的数据,所以我们计算的是 YUV 的 PSNR。
为什么不比较 RGB 的 PSNR 呢?因为:
1. MPEG-4 本来存的就是 YUV 格式,要比较 RGB 的 PSNR,要经过 YUV -> RGB 转换,转换会有损失,应尽量避免。

2. MPEG-4 存的 YUV,是 YUV 4:2:0 格式,也就是 Y 的情报量是 UV 的四倍,取样时四点共享一个 UV 值。
所以转成 RGB 时,要经过 upsampling,YUV 4:2:0 -> 4:2:2 -> 4:4:4 -> RGB24。
upsampling 的工作,一般播放时是由显示卡的硬件来做,所以每种 Codec upsample 的效果都一样。
但是我们在做测试时,使用 Codec 自行解码输出做比较,不会用显示卡硬件的 upsample,而是由各家的 Codec 自行 upsample,这时各家 Codec 的 upsample 好坏,就会影响测试成绩。
然而我们不想比较各家 Codec 解码时 upsample 的好坏,只想比较 Codec 压缩时的功力,谁储存的数据最接近源文件。
因为各家 Codec upsample 的好坏,不影响实际播放时画面的结果;实际播放时,upsample 是由显示卡来做的。
所以我们只比较 upsample 前,MPEG-4 档内储存的 YUV 4:2:0 资料。
如果考虑 Codec upsample 的话,XviD 大概会是最差的。
因为 XviD 的 YUV 4:2:0 -> 4:4:4,完全没有做任何内插,而是直接将解出来的 UV copy 给四个点使用。

3. 因为 XviD 有 Chroma motion(动作搜寻同时考虑 UV)和 Chroma Optimizer(减少红色锯齿,会让 PSNR 下降)等功能,所以分开计算 YUV,看看这些功能对 UV 造成的影响。

Avisynth 的语法是
# 原始档 orig
orig=avisource("Kiddy Grade NCOP_aup_vfapi.avi").ConvertToYV12()
# 压缩档 encoded,强制 YV12 输出
encoded=avisource("Kiddy Grade NCOP_XviD_H.263.avi", false, "YV12")
# 计算 Y PSNR,输出 LOG 文件
compare(encoded, orig, "Y", "PSNR-XviD_Y.LOG", false)

代码 (双击代码复制到粘贴板)
Average PSNR (dB)

                   Y         U         V        YUV
========================================================
DivX 5.0.5:     47.7101   47.6905   47.6547   47.6851
XviD Nic's:     47.5616   47.5750   47.4824   47.5397 <- V(Cr/Chroma Red) 的 PSNR 特别低
XviD 04-25:     47.7279   47.7397   47.6475   47.7050 <- V(Cr/Chroma Red) 的 PSNR 特别低
人眼对 Y 较敏感,Y 的影响力较大,Chroma 比较不重要,分析数据时应以 Y 为主。

XviD 有开启 Chroma Optimizer,这个 pre-filter 会改变 Chroma 的值,使得 Chroma 和原来的差距较大,因此 PSNR 会降低。
不过它可以减少红色部分看起来的锯齿现象,让红色部分看起来较平滑。

考虑文件大小和 PSNR 比 (YUV PSNR/文件大小%) 调整后的分数

DivX 5.0.5: 47.6851
XviD Nic's: 51.4499
XviD 04-25: 52.8295

XviD 大胜 :D
引用 04-29-2003测试二:接下来测试开启 B-frame 的效果

DivX 5.0.5 的设定:
和测试一相同,多加使用 B-frame
DivX 5 B-frame 的默认值,当 I/P Frame quantizer 为 2 时,B-frame quantizer 为 4

XviD 的设定:
和测试一相同,多加使用 B-frame
配合 DivX 5,将 B-frame ratio 设为 100,offset 设为 200,也就是同样使用 quantizer 4
最大 B-frame 个数 4 个

压出来文件大小
DivX 5.0.5: 29,198,336 bytes (100%)
XviD Nic's: 29,896,704 bytes (102.4%)
XviD 04-25: 27,856,896 bytes (95.4%)

XviD Nic's 的 B-frame 压缩率不如 DivX 5。
原因可能有:
1. XviD 的 VHQ 功能目前对 B-frame 没作用。
B-frame 可供选择的压缩模式更多,从 VHQ 能得到的好处更多,不能用非常可惜。
B-frame 少了 VHQ 辅助,原本大胜的差距就被 DivX 5 追上。
由此可见 VHQ 很重要,一定要开。

2. XviD 的 B-frame 是动态地插入,会视画面做判断要不要使用 B-frame
而 DivX 5 的 B-frame 则是固定的,一定要维持 IBPBPB... 的形式。
所以遇到不适合使用 B-frame 的画面,DivX 5 还是要使用 B-frame,并且以高 quantizer 压缩,画质会较差。
而 XviD 的动态判断还在改良,插入的判断较保守,遇到这种高动态、无残影的动画讯源,插入的 B-frame 个数较少,以高 quantizer 压缩的 B-frame 个数减少,压缩率自然下降。
Koepi 编译的版本有加入一个设定,可以让你控制插入 B-frame 的判断,将 threshold 设得越高,B-frame 插得越多。
Nic 的版本没有开放这个选项,用的是内定的默认值 0。

然而经过 sysKin 这一个月来的改进,04-25 的 XviD B-frame 压缩效率大增,文件小了快 2MB !!
那么画质有没有下降呢?
测定 PSNR。
这里要说明一下,由于加入 B-frame,解码时会产生 delayed frame,XviD 开头多一张 frame,DivX 结尾多一张 frame,要把这些多出来的 frame 切掉,才能对齐比对,算出来的 PSNR 才会正确。
例如 XviD 开头多一张,Avisynth 处理的语法
encoded=avisource("Kiddy Grade NCOP_XviD_H.263-B4.avi", false, "YV12").Trim(1,0)

算出来的结果:

代码 (双击代码复制到粘贴板)
Average PSNR (dB)

                   Y         U         V        YUV
========================================================
DivX 5.0.5:     46.5597   46.5629   46.4920   46.5382
XviD 04-25:     46.9404   46.9653   46.8575   46.9211
赢得比不用 B-frame 的时候更多。

考虑文件大小和 PSNR 比 (YUV PSNR/文件大小%) 调整后的分数

DivX 5.0.5: 46.5382
XviD 04-25: 49.1835

还是大胜 :D

============== 无关主题,顺便一提 开始 ==============>

用了 B-frame、Quarter Pixel、GMC 等进阶功能压缩率和画质就会变得比较好吗?
不一定。
B-frame 因为提高 quantizer 压缩,通常来说使用 B-frame 后文件都会缩小,但是品质确有可能降得非常快。
使用 B-frame PSNR 会下降可以理解(因为 B-frame quantizer 较高),但是如果降得太离谱,视觉品质也会很明显的跟着下降。
XviD 的三位大神之一 gruel 曾做过测试,VQEG 的测试 sample 中,有一个影片只要一开 B-frame,PSNR 会整整掉 12.5dB !!
(根据经验,CG 动画类的通常不太适合开 B-frame,不过也有反例,要看素材的内容)
所以哪些影片适合使用 B-frame,哪些不适合用,这正是 XviD 正在努力研究的方向。
Quarter Pixel 也是,根据理论 Quarter Pixel 可以提高压缩率,但是据许多人的测试,开了 Quarter Pixel 后文件有时反而会变大。这也是 XviD 的开发人员正在研究的课题。
同理 GMC 也是,用了不一定会提高压缩率、促进品质。
XviD 希望能够归纳出各种功能适当的使用时机,在适当的时候才使用这些功能,让这些工具能发挥最大的效率。
所以在此之前,如果你的码率够,不计压出来的大小,或是文件很好压缩,可以试着不用 B-frame
然而 B-frame、Quarter Pixel 使用后都有一些视觉上的作用,例如 B-frame 具有减少噪声的作用,Quarter Pixel 会让颜色变深。
如果希望具有这些视觉效果,那么就开启这些功能吧。

<============== 无关主题,顺便一提 结束 ==============
原创粉丝点击