Senior Member
您的住址: El's room
文章: 1,046
|
關於 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 似乎更加重了這個問題,使得誤差累積的錯誤更明顯。
MPEG 在編碼的時候,要將前一個編碼過的畫面解碼出來當作參考畫面。
編碼的時候會用 Forward DCT,解碼的時候要用 Inverse DCT。
編碼器在編碼的時候,需要用到 iDCT,將編碼過的畫面解碼,做為參考畫面。
壓好的檔案可以用不同的解碼器來播放。不同的解碼器,其 iDCT 的算式不一定相同;iDCT 的演算法好幾種,只要解出來和 IEEE Reference Decoder 的誤差在一定範圍內,就算是符合標準的 Decoder。
如果 iDCT 算式不同,則解碼出來的畫面就會和編碼器編碼時,解出來的畫面有一點點不同。而這張不同的畫面會被下一張畫面拿來做為參考的對象,當然,這和編碼時所使用的參考畫面是有點不同的,所以編碼時算出來的動作補償(MC),用在這張畫面上就會產生一點點的誤差。接著,這張 MC 有誤差 加上 iDCT 也有誤差的畫面,又要在被下一張畫面拿來做為參考對象,誤差會逐漸累積,越滾越大。
MPEG-1/2/4 的標準中都有為了這個 iDCT 算式不相符的問題做設計,可以減少 iDCT mismatch 所帶來的問題。
並且,由於 MPEG-1/2 的 GOP 長度都長只有半秒鐘,每半秒鐘就會更新一次,有一個獨立壓縮不參考其他畫面的 I-frame,所以這個問題不嚴重。
但是到了 MPEG-4,這個就變成大問題,因為大家壓 MPEG-4 通常 I-frame 間距都設得很長,這樣誤差會一直累積,連續 P-frame 後畫質會逐漸劣化。
而 Qpel 似乎更加放大了這個問題,誤差會嚴重到形成明顯瑕疵。
要避免這個瑕疵,必須
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 品質算出來最高的。
|