引用
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:
- b frame_threshold works again - I didn't know anyone uses it ;>
U vfw/src/codec.c (rev.1.28) syskin:
- b frame_threshold = 0;
8.4.2003 11:40:
U xvidcore/src/encoder.c (rev.1.98) syskin:
- b frame_threshold not supported -> disabled
U xvidcore/src/motion/motion_est.c (rev.1.64) syskin:
- faster; better vhq; b frame-decision changed again
U xvidcore/src/motion/motion_est.h (rev.1.6) syskin:
- faster; better vhq; b frame-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 b frame 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 Key frame 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 會讓顔色變深。
如果希望具有這些視覺效果,那麼就開啟這些功能吧。
<============== 無關主題,順便一提 結束 ==============