測試一: 固定品質 quantizer 2 壓縮,壓出來檔案越小,壓縮效率越高。
然而檔案小,可能是壓縮時捨棄較多係數換來的(會造成畫面模糊、細節損失、誤差增加、畫質下降),所以同時計算 PSNR,測量品質。
PSNR(Peak Signal to Noise Ratio)是和原始影片比較的結果,PSNR 越高,代表和原來的畫面接近,品質越高。
將壓縮前和壓縮後的畫面,每個 Pixel 的值相減,將誤差平方,加總,求平均。
這個算出來的值叫做 MSE。
然後和最大訊號值的平方相比,例如 Pixel 的值範圍是 0~255,最大訊號值就是 255,
那麼就是和 255 的平方相比。
求出來的值取 20*log,算出來就是 PSNR,單位是 dB。
PSNR = 20*log (255^2/MSE)
所以 PSNR 算的是「和原始畫面的差距」。
MSE 算式可以看 berkeley 的網頁
http://bmrc.berkeley.edu/courseware...nment/psnr.html
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 大勝
