Senior Member
您的住址: El's room
文章: 1,046
|
測試三: 比較 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
其他同測試二
|