[SilkyBible] XviD系列-8

来源:互联网 发布:手机淘宝可以买火车票 编辑:程序博客网 时间:2024/04/27 07:26
 
引用 04-29-2003测试三: 比较 Multi-pass 的结果,目标将文件压缩至 14,000,000 bytes
DivX 5.0.5 使用 B-frame,quantizer 2。
XviD 04-25 使用 B-frame 个数 2,ratio 200,offset 0,quantizer 2。
XviD 另外再压一个 VHQ mode: 4 - Wide Search 的版本。
固定 quantizer 模式下,提升 VHQ mode 会减小压出来的文件大小,不过 PSNR 会下降。
在极低码率时使用 VHQ mode: 2~4 可以提升整体品质。

DivX 5.0.5 0-pass: 29,198,336 bytes -> 14,000,000 (47.9%)
XviD VHQ-1 1-pass: 27,917,414 bytes -> 14,000,000 (50.1%)
XviD VHQ-4 1-pass: 26,745,202 bytes -> 14,000,000 (52.3%)

影片的分辨率 640x480,23.976fps,长度一分半钟,最终文件大小定为 14000 KB,每个 Pixel 平均分到 0.172 个 bits,已经在 Gordian Knot 这个软件建议的品质以下。
而且这部影片并不好压缩,当码率低于一定水准以下,画面会劣化非常快。
很想看看压出来会是什么样子 :P


DivX 5.0.5 的设定:
Multipass, nth pass
Max bitrate: 12800kbps
Encoding bitrate: 1280kbps
Bitrate modulation: 0 (Constant quality)
其它设定同测试二

DivX 5 的 B-frame 默认值 quantizer 是 I/P Frame 的两倍,这个文件压出来 P-frame 大都接近 4,B-frame 的 quantizer 则大都为 8。

XviD 的设定:
============== 无关主题,顺便一提 开始 ==============>

我们知道 XviD 的 2-pass 是它的最大弱点。目前 2-pass 的演算法很混乱,而且当初设计时也没有考虑到后来加入的新功能 B-frame,同时:
1. XviD 的 2-pass 演算法 1st-pass 的时候用 quantizer 2 压一遍,2nd-pass 根据 1st-pass 压出来的 frame size 做调整。
以 linear-scaling 为例,假如目标文件大小是 1st-pass 压出来的文件大小的一半,则每个新的 frame size 就是原 size 的一半。
假设 frame size 和 quantizer 之间有一线性关系,2nd-pass 提高每个 frame 的 quantizer 压缩,使压出来的 frame size 接近我们所预期的目标大小。
我们设定一个比特储存槽的大小,如果压出来的 frame 超过预期大小(overflow),可以先借用比特储存槽内的比特来用。
如果压出来的 frame 小于预期大小(underflow),则多的比特就可以还给比特储存槽。
比特储存槽会在一段时间内调节(payback),最后压出来的文件大小会接近设定的目标大小。

然而这样的假设是错的,
1) frame size 和 quantizer 之间没有一线性关系
2) 2nd-pass 的参考画面和 1st-pass 不同,1st-pass 的参考画面是前一张用 quantizer 2 压缩的画面,画质很好。
而 2nd-pass 的参考画面是前一张提高 quantizer 压缩的画面,画质不像 1st-pass 时那么好。
2nd-pass 参考这张画面压缩,压缩的困难程度比 1st-pass 高,要符合预期的文件大小,quantizer 可能必须非常高。
这种 scaling 方法没有考虑到实际压缩时,画面的复杂程度,而仅以第一次压缩时 quantizer 2 的状况
来做调整,可能会发生落差太大的情况,会造成某些非预期的压缩瑕疵。

2. linear-scaling,将所有 frame size 依相同比例下降,却没有考虑到各个画面的复杂程度不同,有的画面减小太多码率,会造成 distortion 太严重,压缩瑕疵会非常明显。
用 linear-scaling quantizer 的震荡幅度太大,无法维持一恒定品质。

3. B-frame 的 quantizer 根据前后 I/P Frame 的 quantizer 调整,如果前后 I/P Frame 的 quantizer 太高(例如压缩的困难程度超过预期,但是 Encoder 为了要符合设定的 frame size,会突然用很高的 quantizer 压缩),这时 B-frame 的 quantizer 会拉得更高,画面会出现非常明显的压缩瑕疵。

4. 连续太多个 B-frame,如果 B-frame 的 quantizer 又很高的话,会出现很明显的压缩瑕疵。

5. 为了避免上述的瑕疵,将 B-frame 的 quantizer 调低的话,B-frame 的压缩率会下降,整体的品质也会下降。

所以.....

XviD 开发中的 dev-api-4 有新的 RC 演算法,比以前的演算法好很多,没有上述的问题,也不会再出现一堆莫名其妙的瑕疵,据测试,PSNR 比现在的版本提高 2dB,非常恐怖。
在 dev-api-4 完成之前,现阶段用 XviD 的 2-pass 要得到好的结果,没有办法,必须视情况自己手动调整。
1. 如果 1st-pass 压出来的文件大小 对 目标的文件大小 的差距不大,则用 linear-scaling 可以得到很好的效果。

2. 如果差距接近一半,可能需视情况手动调整、限制 I/P Frame 的 quantizer。

3. 如果差距极大,可能需视情况使用 Curve Compression。

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

B-frame 的 ratio 设为 200,offset 设为 0,这样 B-frame 的 quantizer 会是前后画面 quantizer 平均的两倍,如果前后都是 quantizer 4,B-frame 的 quantizer 就是 8。
静态场景 XviD 会连续插入 B-frame,连续多个 B-frame 如果又是高 quantizer,视觉上会有明显瑕疵(例如画面好像在浮动或是流动的现象)。
为了避免这个问题,减少 B-frame 个数为 2 个。
为了提高 B-frame 的压缩率,有效利用 B-frame,我们将 B-frame 的 quantizer 设为两倍,但是如果遇到前后 I/P Frame 的 quantizer 很高的话,B-frame 的 quantizer 会更高,而且以倍数成长,画质会惨不忍睹。
考虑我们所压的文件大小和 1st-pass 比,压缩比是 50.1%,I/P Frame 的 quantizer 应该可以维持在 6 以下,所以我强制限制 I/P Frame 的 quantizer 范围为 2~4,这样 B-frame 的 quantizer 最高只能到 8,避免 B-frame 压出瑕疵。

其它设定皆使用 linear-scaling 的设置
I-frame Boost %, High bitrate scenes%, Low bitrate scenes% 都设为 0
below i-frame distance...: 10
I-frame bitrate reduction %: 20
Bitrate payback delay: 240
Payback proportionally
其它同测试二

这样设定压出来,XviD 的 quantizer 分布
VHQ-1
代码 (双击代码复制到粘贴板)
Quantizers : 
------------------------------
I/P-Frame :
Quant 2 Used : 22 Times
Quant 3 Used : 129 Times
Quant 4 Used : 1079 Times
B-Frame :
Quant 7.00 Used : 99 Times
Quant 8.00 Used : 820 Times
Quant 6.00 Used : 12 Times
Quant 4.00 Used : 6 Times
Quant 5.00 Used : 2 Times

Average Quantizer : 5.581

Intra-Frame (Key-Frame) Quantizers
------------------------------------
Quant 2 Used : 12 Times, Percentage Used : 12.24%
Quant 3 Used : 36 Times, Percentage Used : 36.73%
Quant 4 Used : 50 Times, Percentage Used : 51.02%

Average I-Frames Quantizer : 3.388

Inter-Frame (P-Frame) Quantizers
------------------------------------
Quant 2 Used : 8 Times, Percentage Used :  0.71%
Quant 3 Used : 93 Times, Percentage Used :  8.23%
Quant 4 Used : 1029 Times, Percentage Used : 91.06%

Average P-Frames Quantizer : 3.904

B-Frames Quantizers
------------------------------------
Quant 7.00 Used : 99 Times, Percentage Used : 23.33%
Quant 8.00 Used : 820 Times, Percentage Used : 26.67%
Quant 6.00 Used : 12 Times, Percentage Used : 20.00%
绝大部分的 P-frame 都是以 quantizer 4 压缩,相对应地,B-frame 几乎都是以 quantizer 8 压缩。
由于限制的 quantizer 范围太小的关系,上下震荡的幅度很小,几乎快变成和用 quantizer 4 固定压缩没两样了 ^^;

VHQ-4 的 目标文件大小设为 14110 Kbytes,quantizer 分布
代码 (双击代码复制到粘贴板)
Quantizers : 
------------------------------
I/P-Frame :
Quant 2 Used : 22 Times
Quant 3 Used : 226 Times
Quant 4 Used : 981 Times
B-Frame :
Quant 7.00 Used : 216 Times
Quant 8.00 Used : 696 Times
Quant 6.00 Used : 19 Times
Quant 4.00 Used : 6 Times
Quant 5.00 Used : 3 Times

Average Quantizer : 5.477
平均 quantizer 较 VHQ-1 下降 0.134。


压出来文件大小
DivX 5.0.5 2-pass: 14,501,888 bytes ( 100%)
DivX 5.0.5 3-pass: 14,508,032 bytes ( 100%) <- 文件偷偷变大一点
DivX 5.0.5 4-pass: 14,510,080 bytes ( 100%) <- 再变大一点
XviD VHQ-1 2-pass: 14,489,600 bytes (99.9%)
XviD VHQ-4 2-pass: 14,485,504 bytes (99.9%)
代码 (双击代码复制到粘贴板)
PSNR (dB)

                          Y         Y         Y
                         Min       Avg       Max
========================================================
DivX 5.0.5 2-pass:     33.5968   43.3420   99.9947  <- Max 99.9947dB 是全黑的画面
DivX 5.0.5 3-pass:     35.1456   43.4162   99.9947  <- 最低 PSNR 上升,平均 PSNR 上升
DivX 5.0.5 4-pass:     35.1456   43.4328   99.9947  <- 平均 PSNR 再上升
XviD VHQ-1 2-pass:     36.2034   43.8934   99.9947  
XviD VHQ-4 2-pass:     36.0888   43.8367   99.9947  <- 最低、平均 PSNR 皆下降
============== 无关主题,顺便一提 开始 ==============>

也许有人有疑问。
这个测试里的源文件大家都一样,都是由 Avisynth 做的 YV12 原始档。
avisource("Kiddy Grade NCOP_aup_vfapi.avi").ConvertToYV12()

所以测试保证公平。

然而 Avisynth 载入的 Kiddy Grade NCOP_aup_vfapi.avi 这个档是 RGB24 的 VFAPI,
为什么不干脆用全程 Avisynth,做全程 YV12 的制程?
因为:
1. 我需要用到 TMPGEnc 做 IVTC。
2. 全程 YV12 制程有所限制,不是每种讯源都可以使用。

有什么限制?
代码 (双击代码复制到粘贴板)
1. 原始讯源不用作 IVTC,不需要用到 TMPGEnc 或 AviUtl。
   Avisynth 虽然也有 IVTC 的 plugin,例如 Decomb,
   但是我觉得不完美,用 TMPGEnc 手动一张一张选比较完美(废话.. ^^;)
   如果 IVTC 简单,不会用到单张去交错或 copy frame
   可以利用 tprivtc.dll 这个 plugin,读取 TMPGEnc 专案档内的
   IVTC 信息(先用 TMPGEnc 做好 IVTC 存成项目文件),使用语法是
   DoubleWeave().TPRIVTC(<string file.TPR>,<debug mode>)

   这样的话还是可以使用 Avisynth 做 YV12 制程。

2. 压 MPEG-4 要用全程 YV12,必须要用 VirtualDubMod 这个软件,
   用这个软件选 "Fast recompress" 压缩模式,VirtualDubMod 才会传送
   原封不动的 YV12 数据给 Codec 压缩。
   其它如本家的 VirtualDub,即使选 "Fast recompress",VD 也还是会先
   转为 RGB,再送给 Codec 压缩。

3. 有许多 DVD 硬压的机器很白痴,明明是 progressive 画面,却使用 interlace
   模式压缩,也就是 chroma 取样的时候是 chroma1 = 0.75*c1 + 0.25*c3
   而不是 (c1+c2)/2
   遇到这种 DVD,DVD2AVI 的 Frame Type 会显示 Interlaced,
   但是画面其实并没有交错。
   这样子如果用全程 YV12 的制程,
   YV12(DVD, interlaced) -> YV12(MPEG-4, interlaced)
   则压好的 MPEG-4 里面的 chroma 信息,还是和原来的 DVD 一样是 interlaced
   可是 MPEG-4 AVI 里面并没有(旗标)注明这是 interlaced Frame
   解码的时候 MPEG-4 Decoder 会假设画面都是 progressive 的,
   所以做 chroma upsampling 的时候会把解出来的 chroma1 分给 c1 和 c2
   而不是正确的 c1 和 c3(当初 chroma1 是由 c1 和 c3 取样来的),
   这样会造成 chroma upsampling 错误。

   所以遇到这种文件,原始 DVD 一定要解码为 YUY2,此时 MPEG-2 有 interlaced
   旗标可以告诉 DVD2AVI/MPEG2Dec3 等译码器要怎么做 upsampling 才正确。
   YV12(DVD, interlaced) -> YUY2 -> YV12(重新取样时以 progressive 取样)
   -> YV12(MPEG-4, progressive)
   播放时就会正确了。
对了 Nic 写的 MPEGDecoder.dll 的 Chroma upsampling 是错的,不要用。

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


虽然平均 PSNR 大家都有 43dB,但是最低 PSNR 则在 35dB 上下,因为是动画,锐利线条周围的 ringing effect 瑕疵看起来已经非常明显,已经在我忍耐的极限边缘 :P
引用 04-29-2003
引用强烈赞成。现在想自己动手做一下DVDRIP,可是找不到比较新的教程,无法入门呀。请Silky大哥无论如何也要出手呀。
每个选项的作用和意义,Doom9 的 XviD Guide 已经更新了唷,有新版的选项设置说明。
另外这个网页也有选项的设置说明
http://www.everwicked.com/content/XviD_Guide/xvid-07.php

其实我已经把 XviD 的相关设置选项的选择方法都写在上面的测试报告里面了,您没有注意到吗?
上面的测试报告与其说是测试报告,倒不如说是心得报告 :P
因为 XviD 压出来的结果会赢已经是这些日子以来大家都知道的事实,所以如果只是做单纯的测试数据报告,似乎有点无聊,所以小弟把制作时的想法,为什么这么选择,这么选择有哪些缺点,改进调整的方向和方法都写在上面的说明里面了。
例如为什么要提高 B-frame 的压缩率? 促进整体品质。
提高 B-frame 的压缩率将码率分给 I/P Frame 有什么好处? 参考的 I/P Frame 画质好,B-frame 的瑕疵会看不出来,整体品质提高。
B-frame quantizer 设得太高会有什么缺点? B-frame 会出现一堆瑕疵。
B-frame quantizer 设得太低会有什么缺点? 压缩率下降,连带整体品质下降。
B-frame 连续个数设得太多会有什么缺点? 静态画面会出现瑕疵。
什么时候判断考虑限制 quantizer? 视 1st pass 压出的文件大小和目标大小判断。
限制 quantizer 的范围要设多少才好? 视预测的 quantizer 使用情况判断。
限制 quantizer 太极端会有什么缺点? 会变成都用同样的 quantizer 压缩,变成固定品质压缩,那么用 1-pass quantizer 压缩即可,还做 2-pass 干嘛。
......
等等。
这些都是小弟的使用心得,其实都写在里面了

至于 DivX 5.0.5 的设置,其实没什么好设的,大部分的选项 DivX Networks 都已经从使用者接口中拿掉了,如果你还是要控制,可以从 CLI 命令列中下指令控制,不过我找不到需要特别这么做的理由,DivX 5.0.5 预设的 RC 演算法已经工作得相当好,几乎可以说只要 bitrate 指定好,开始压就可以去睡了,商业软件就是要做得这么好用才行

以上小弟使用的方法,并不是最好的设置,例如 XviD B-frame 的 quantizer 一定要和 DivX 5 一样设为两倍才可以吗?用 ratio 150, offset 100 会不会更好一点?这个可以再实验研究。B-frame 的 quantizer 下降,那么 I/P Frame 的限制范围可以放得宽松一点吗?这个也可以再实验研究。
同理,DivX 5.0.5 的设定这样是最好的吗?如果把 Bitrate modulation 不要设在固定品质,还是设给低动态的画面多一点 bitrate,或是设给高动态画面多一点 bitrate,看起来会不会比较好?
这些,都要再实验研究、归纳、整理,找出不同类型的讯源、不同的码率,适合的使用方法 ^^;
而这些就需要常常压制影片的人,才能作这样的整理与报告了。
小弟只能从原理上,提供一些思考的方向


今天休假,不过现在又有事情要做,所以图和测试四要晚点才能放上来,请见谅。
(而且图很多,要整理要花点时间 ^^;)
引用 04-29-2003好恐怖,gruel 完成了 Trellis Quant(天啊,我盼了好久了),现在已经加到 dev-api-4 里面,而 dev-api-4 也已经完成得差不多了,看起来很稳定,XviD 的首页发布了以下的新闻
引用Homepage: Release 1.0 around the corner
Posted by: gruel on Monday, April 28, 2003 - 11:22 AM CET (119 Reads)


Hi,

good news everyone! Things are moving fast.

The new API (dev-api-4) is now close to final. We got a new rate-distorsion optimized quantization mode (Trellis Quant) and differential Global Motion Estimation (GME) is ready to be included into the code as well.

When these features have proved to be stable, it's time for XVID 1.0. Stay tuned!
3 warp points 的 GMC(Global Motion Compensation)也已经完成(DivX 只有 1 warp point,等于没用,1 warp point 做得到的事情,用一般的 Local MC 也可以做得到,用 GMC 不一定会比较省 bit),另外 gruel 用 skal 写的 GME(Global Motion Estimation,GMC 的前置作业,GMC 是 GME 的结果,就像一般的动作搜寻 (L)ME,ME 的结果做补偿补上误差叫做 (L)MC)程序代码做参考,改写了原本的 GME 的演算法,现在的 GME 更有效率,开启 GMC 功能文件不会变大。(还在测试中,gruel 在找什么情况下使用 GMC 会最有效率,encoder 会判断,只有当 GMC 可以省 bit 时才使用 GMC)

Trellis Quant 初步测试可以提高 PSNR 大约 0.1~0.3dB 左右。
由于使用 Trellis Quant 就不会用原本的 Too Small Limit 限制,不知道固定 quantizer 2 压缩,使用 Trellis Quant 会不会提升 PSNR。FFMPEG 是会的。
不过 Trellis Quant 强大的威力还是在中低码率时会更明显。

XviD 1.0 差不多快出来了
Things are moving fast!!

引用 05-04-2003抓图

所有的图都是以该 Encoder 各自的 VFW Codec 解码,强制输出 YV12,由 Avisynth 统一做 YV12 -> RGB32,语法如下
avisource("Kiddy Grade NCOP_DivX5.05-B_4-pass.avi", false, "YV12").ConvertToYUY2().ConvertToRGB32()

先转成 YUY2 再转成 RGB32 的原因是,目前的 Avisynth 2.5,YUY2 -> RGB32 的 upsampling 计算式比 YV12 -> RGB32 的计算式,品质要好。Avisynth 的 YV12 -> RGB 计算式,目前还没改成较高品质的 upsampling 方法。

因为图太多,文件太大,为避免下载负担,部分情况用口述。

开头有一段缓慢 zoom in,镜头慢慢拉远的场景,画面是漆黑的宇宙和中间发光的星球,其黑白交界处,XviD 有比较明显的方块感。这一段 XviD 会插入很多 B-frame,B-frame 用高 quantizer 压缩,很容易出现方块。减少连续 B-frame 个数,可以减低这种方块感。DivX 5 也有这种方块现象,不过因为 DivX 5 的 B-frame 最大个数只能为一个,一个 B 之后一定要接一张 P,形成 ..BPBPBP... 这样的构造,所以不会有连续好几张有瑕疵的 B 出现在画面上,停留一段长时间而被人眼注意到。另外 DivX 5 的 DirectShow Filter Decoder 如果将解码的品质调高,会有 Post-Processing 的 De-block Filter,去方块滤波器的作用,也可以减少这种方块现象,所以看起来不明显。XviD 要避免,可能要减少 B-frame 的个数、降低 B-frame quantizer、改用 MPEG quant 压缩(MPEG quant 方块瑕疵较少),或者是开启 XviD Decoder 的 De-block Filter。

接下来是这部动画的标题字幕,「Kiddy Grade」,红色的字,完全静态的画面。XviD 在这里没有问题,但是 DivX 5.0.5 在线条的边缘,有很诡异的闪烁的噪声。这个看单张抓图看不出来,要实际观看时,接连好几张画面连着看,才会发觉这种时间轴上噪声闪烁的现象。在后面的画面中 DivX 5.0.5 也是一样,在静态的场景,有时线条边缘会有闪烁的噪声,很引人注意。

接下来的图片是 XviD 在这整片中最糟的 case。
Frame #628 DivX 5.0.5,这是一张 B-frame,Quantizer 8 压缩。前一张 Frame #627 是一张 P-frame,Quantizer 4 压缩,画面和这张 B 一样。
注意图中用白色箭头指出来的部分。
左边的两个箭头指出来的瑕疵,一个是黑色的细线段,一个是灰色的方块,这两个瑕疵都是源文件中没有的。而右边箭头指的瑕疵,看起来很奇怪,头发边缘的线段突然缺了口,放大观察,上面和下面一点的地方也有缺口,这个缺口看起来很像是有一个灰色的方块插进去, 中断了原本连续的线条。
这是怎么回事呢?
我们看下一张 Frame #629,Frame #629 是一张 P-frame,Quantizer 4 压缩。Frame #629 较 Frame #628 脸部往左移动了位置。仔细观察两张图片,细线段瑕疵出现的位置,是下一张图头发尖端移动到的位置,而左边线段的缺口位置,在下一张图是灰色的墙壁。(抓下来用 ACDSee 切换着看会更清楚)
628DivX B-frame Quantizer 8629DivX P-frame Quantizer 4

我们知道 B-frame 有一种动作预测模式叫做 Direct Mode,用这种预测模式时,该 B-Frame 的 Forward/Backward Motion Vector 是由下一张 P 直接产生:
I B P
连续动作时,我们可以预测中间的那张 B,运动会介于 I 和 P 之间,所以我们直接拿 P 的 MV 除以二,作为 B 的 Forward/Backward MV,以 I 和 P 的平均,做为参考对象。
这样我们就可以省下记录 MV 的 bit,只要记录和 (I+P)/2 的误差就好了。这是 B-frame 压缩率最高的动作预测模式,在高 quantizer 中,这种模式使用的次数会比较多。

那二个白色箭头所指的瑕疵,就是使用了 Direct Mode 压缩,以前后画面的平均为参考对象。然而后面那张 Frame 在这些地方和前面的差距很大,B-frame 又用高 quantizer 压缩,无法精确记录参考后的误差,所以便出现了这种「后面画面的影像残留在前一张画面」的诡异现象。

我们来看 XviD 的惨状
628XviD B-frame Quantizer 8629XviD P-frame Quantizer 4

XviD 在 #628 少了一些残像的瑕疵,不过还是有灰色的方块。惨的是,这几个画面的动态都不大,XviD 是插入最大的 B-frame 个数,#628 的前一张 #627 也是 B-frame,也是有灰色方块,连续两张 Frame 都有灰色方块,比较容易被看出来。
XviD 的另一个败笔是背景灰色的墙壁,方块瑕疵很明显,很容易注意到。虽然 XviD 在人物脸部,线条周围的噪声较 DivX 少,不过背景的方块还是很引人注目。
原创粉丝点击