引用:
Originally posted by if2
Doom9討論區有文章討論了∼∼並做了多項測試
這裡
有興趣的去看看吧∼∼
XviD似乎∼∼輸了
|
做測試的 Sagittaire 很相信 PSNR 的分數,認為 PSNR 很科學;PSNR 很科學沒有錯,但是做測試的方法也要很嚴謹,才不會歸納出錯誤的結論。
1. 首先,只做一、二個短短的 Trailer,用這一、二個短短 Trailer 的成績來總結一個 codec 全部的表現,這是錯誤的。
codec 在不同的訊源輸入會有不同的表現,一個 codec 可能在大部分的訊源中都贏另一個 codec 0.02dB,卻在某一類的訊源大輸另一個 codec 0.5dB,這是有可能的,以上正是我的親身經歷,比較的兩個 codec 是 XviD 和 DivX Kaukura。
做測試必須蒐集各種類型的訊源,例如 VQEG(Video Quality Experts Group) 網站擺的那些專門用來測試視訊品質的 test sequence,網羅了各種類型,有實攝訊源、動畫、CG,有的色彩豐富,具有非常複雜的材質紋理,有的是局部區域運動 (Local Motion),有的是整體全域運動 (Global Motion),或者混亂不規則運動 (Chaos Motion),有的有很多雜訊,劇烈亮度變化.. 等等,各種類型的影片。做測試時最少也要比較五、六種訊源,才能得到一個 codec 整體的"特性" 和全面的表現。
不然發表測試的時候也要告知讀者,我做的測試訊源類型是什麼,有哪些特性,可能只能涵蓋這個部分,不代表全部。
2. 做測試時要盡量排除其他任何可能的因素干擾,例如 Sagittaire 的比較方式
代碼:
# --> Video Opening <--
source=AviSource("D:\Mes dossiers\B.A\Les deux tours\Encodage.avs")
source=ConvertToYV12(source)
video=AviSource("D:\Mes dossiers\B.A\Les deux tours\Kaukura-950.avi")
video=ConvertToYV12(video)
# --> PSNR analysis <--
CompareYV12(video,source,"","PSNR-Kaukura-950.txt")
是不好的,壓縮時 source 就應該先轉成 YV12
source=AviSource("D:\Mes dossiers\B.A\Les deux tours\Encodage.avs").ConvertToYV12()
用這個當作 source,VirtualDubMod 選 "Fast recompress" 直接送給 codec 壓縮。
這樣 codec 會直接接收 YV12 的資料,直接開始壓縮,而不用做 RGB->YUV 的轉換工作。不同 codec RGB->YUV 轉換式計算精度不一樣,會影響數據,這點要排除。還有不同 codec 在做 YUV 4:4:4 -> 4:2:0 的 subsampling 的做法也不一樣,DivX 3.11 是只取四個 chroma 的最左上角那個,其他三個 sample 直接丟掉,而比較好的做法是將四個 sample 加權平均取樣,這一個做法不同就會有很大的差異。
所以在壓縮前我們就先幫 source 做好 ConvertToYV12,大家的 ConvertToYV12 都是由 Avisynth 做的,立足點一樣,計算出來的數據才不會有差異。不然由 codec 各自做 RGB->YUV 或 4:4:4->4:2:0,壓縮前的 source 就不一樣,根本無從比較起。
接著,比較時應該要強制 codec 吐出 YV12 的資料,直接比較 YV12,否則任由 codec 吐出各種類型的格式,譬如 RGB,這樣就慘了
video=AviSource("D:\Mes dossiers\B.A\Les deux tours\Kaukura-950.avi")
video=ConvertToYV12(video)
應該改成
video=AviSource("D:\Mes dossiers\B.A\Les deux tours\Kaukura-950.avi", false, "YV12")
強制 codec 輸出 YV12。
不然任由 codec 輸出 RGB 再轉為 YV12,不同 codec YUV->RGB 算式精度不一樣,還有 YUV 4:2:0 -> 4:4:4 的 upsampling 做法不一樣,例如 XviD 是直接 copy 解碼的 chroma 分給對應的四個 chroma,這一個做法不一樣,結果就天差地遠,更不用提輸出 RGB 比較 YV12,中間需經過 YV12->RGB->YV12 多次轉換所造成的誤差。
一般我們播放的時候是用 DirectDraw YV12 或 YUY2 Overlay,直接丟 YV12 或 YUY2 給顯示卡,codec 的 YUV->RGB,4:2:2->4:4:4 的品質一點也不影響播放時的品質。