瀏覽單個文章
Shade
Senior Member
 
Shade的大頭照
 

加入日期: Oct 2002
您的住址: El's room
文章: 1,046
呃... 有人對 VHQ 的原理有興趣嗎? ^^;
以前寫過這麼一篇說明...
==
簡單的說,高品質模式,開了同流量下品質比較好,固定品質下檔案比較小。

複雜的說... 真的要複雜的說嗎? :P
(有人要看嗎? ^^;)

我們知道壓縮的時候會將畫面切成好多個 16x16 大小的小方塊作動作預測,每個方塊稱為 Macroblock。
每個 Macroblock 壓縮的時候要做好幾個選擇,首先我們要決定這個 Macroblock 是要獨立壓縮,壓成一個 intra-block,或者是要參考其他畫面壓縮,壓成一個 inter-block。
接下來如果是壓成 inter-block,要參考其他畫面作預測壓縮,那麼要使用哪種動作預測模式呢?
例如 MPEG-4 有 INTER4V(4MV)模式,一個 Macroblock 可以有 4 個 Motion Vector(動作向量),內部 4 個 8x8 的小方塊各自使用一個 MV,各自記錄最接近的參考對象。
使用 4MV 讓內部的小方塊各自參考誤差最小的對象,可以縮小所需記錄的誤差值,但是同時需要記錄的向量個數也會增加為 4 個,一來一往、此消彼長,到底能不能提高壓縮效率並不一定,要看情況。
那麼是要使用一般的 16x16 方塊共用一個 MV 的預測模式(INTER),還是要使用 8x8 方塊的 4MV 預測模式(INTER4V),這個 encoder 必須要作決定。

最後 encoder 還要決定找到的參考對象誤差是不是很小,如果小到一定程度,我們就可以視為沒有誤差,不用編碼、記錄這個 Macroblock 的誤差(not coded)。
此時如果 MV = (0,0),也就是參考的對象和目前的方塊在畫面上的同一位置,那麼這個 Macroblock 就可以 skip 掉,完全不記錄任何資料,顯示的時候直接使用前一個畫面相同位置的方塊來顯示。

Macroblock 要用上面哪種模式壓縮,壓出來所需的 bit 會最少,encoder 必須要作判斷。
判斷的時候會根據理論上的算式作判斷,例如如果 四個SAD8x8的總和 < SAD16x16,我們就把這個方塊用 INTER4V 模式壓縮。
SAD 是 sum of absolute differences 的縮寫,誤差絕對值的總和,是一種計算誤差量的方法。
根據這些簡單的計算判斷,encoder 可以很快速的決定要用哪種模式壓縮。
但是這樣壓出來真的會最小,所需的 bit 真的會最少嗎?
答案是不一定。
可能這個 Macroblock 用 INTER 壓縮會比較有效率,壓出來所需的 bit 會比較少,但是卻被計算式判斷為要使用 INTER4V 壓縮,白白浪費了許多 bit。
所以 XviD 和 FFMPEG 的開發小組之前就發現,使用 4MV 模式的時候,壓縮效率反而不好,就是因為 encoder 的判斷太簡單,造成了 4MV 的使用沒有效率,使得壓出來的檔案反而更大。

FFMPEG 首先設計了一個 VHQ 模式,也就是高品質模式,也叫做 brute force mode。
在這個模式底下,encoder 會把 Macroblock 各種可能的壓縮模式都壓一遍,INTRA/INTER/INTER4V... 都壓一次,然後從裡面選壓出來最小,所需花費的 bit 數最少的一種模式來使用。
這樣就可以確定,我們選擇的壓縮模式是最有效率的壓縮模式。
實驗結果證明,使用 4MV 的時候一定要搭配 VHQ 模式,壓出來的品質才會最好,檔案也會是最小的。
不過當然,使用 VHQ 模式壓縮的時間也需要比較久。

XviD 現在也設計了這個 VHQ 模式,第一件做的事情(VHQ 設定選項選 "1 - Mode Decision")就是上面說的 brute force,每種模式都壓一次,選最好的。
舊 2003-03-26, 03:33 PM #9
回應時引用此文章
Shade離線中