3.5 熵編碼
熵編碼把一系列用來表示視頻序列的元素符號轉變為一個用來傳輸或是存儲的壓縮碼流.輸入的符號可能包括量化的變換系數(像上面所說的運行級或零樹),運動向量(對于每個運動補償塊的向量值x和y),標記(在序列中用來表示重同步位的點),頭(宏塊頭,圖象頭,序列的頭等)以及附加信息(對于正確解碼來說不重要的信息).在這一節中,我們將介紹一些預測性的預編碼的方法(用來表示編碼幀中的區域關系)在之后接著介紹兩種被廣泛使用的熵編碼技術----修改后的哈夫曼編碼和算術編碼.
3.5.1 預測編碼
在圖象的某些區域中,某些符號是高度相關的.比如說,相鄰的intra編碼塊的平均值或DC值是非常相近的,相鄰的運動向量可能會有相似的x和y值,等等.編碼效率可以由從前面編碼的數據預測當前塊或宏塊的元素,并編碼它們之間的差異值來進行提高.一個塊或宏塊的運動向量指明了在之前編碼的幀的預測參考值的編移量.相鄰塊或宏塊的向量經常是相關的因為物體的運動可能會經過幀的一個很大的區域.這對于很小的塊或有大量運動物體的運動來說尤其是如此的.運動向量的壓縮可以由從之前的編碼向量來預測每個運動向量來改進.一個對于當前宏塊X的向量的簡單的預測是水平相鄰的宏塊A,三個或更多的之前編碼的向量可以被用來預測宏塊X的向量(比如A,B和C).預測的和實際運動向量的差值被編碼并傳輸.
量化參數或量化器步長控制了壓縮效率和圖象質量的平衡量.在實時的視頻編解碼中,在一個編碼幀中修改量化是必要的(例如改變壓縮率來使編碼碼率與傳輸信道碼率相適應).在相鄰的宏塊中很小的改變參數值就是足夠的了.修改了的量化參數必須告訴解碼器,而我們不把新的量化參數值傳輸走,而是傳輸一個差異值(比如+1,-1或+2,-2)來表示這個參數值變化了多少.因為用來編碼差異值要比編碼整個量化參數來說要使用更少的位.
3.5.2 變長編碼
一個變長的編碼器把輸入符號映射到一系列的碼字(VLC).每個符號映射到一個碼字,而碼字有變化的長度但是必須包括整數個位.經常出現的符號用短的VLC來表示,而不常出來的符號用長的VLC來表示.對于大量壓縮符號來說,這樣的操作會讓壓縮率提高.
3.5.2.1 哈夫曼編碼
哈夫曼編碼向每個VLC進行賦值的方法是基于對于不同的符號的出現機率的不同來定的.根據Huffman在1952年提出的原始設想,計算每個符號的出現機率是必要的,用這個結果來構造一系列的變長的碼字.
如果分布機率值是準確的,那么哈夫曼編碼提供了一種對于原始數據來說很有效的壓縮方法.然而,為了達到最優化的壓縮,對于不同序列的不同的碼表是需要的.
3.5.2.2 預計算的哈夫曼編碼
哈夫曼編碼過程對于視頻的編解碼有兩個不利的地方.首先,解碼器必須使用在編碼器設置的相同的碼字來進行解碼.傳輸這些信息到解碼端會加大傳輸內容,并降低壓縮效率,尤其對于短的視頻序列來說.第二,對于大的視頻序列的可能性值表在視頻數據編碼之前是不能得到的,這就會造成一些在編碼過程的延時.由于這些原因,近來的圖形和視頻編碼標準基于通常的視頻序列的統計模型進行編碼,用來解決這個問題.
變換系數(TCOEF)
MPEG-4視頻部分使用量化系數的3D編碼,它們使用每個碼字來表示一個(run,level,last)的組合.總共102個特定的(run,level,last)組合有VLC值.在每個碼字的last位是's',用來指明符號的解碼系數符號(0表示正,1表示負).
一個包含超過八個0的run值的碼字是無效的,這樣任何以000000000開始的碼字都表示碼流中有錯誤.所有的其他序列都可以被用有效的編碼值來進行解碼.注意最小的碼被賦給小的run和小的level值中,因為它們發生的機率比較大.
運動向量差(MVD)
差值編碼的運動向量被編碼為一對VLC,一個是對于x值的,一個是對于y值的.注意最短的碼表示小的運動向量差值(比如MVD=0表示簡單的碼值1).這些碼表與哈夫曼值是非常相似的,因為每個符號都被賦給了唯一個碼字.通常用的符號被賦了短碼字,在單獨的一個表中,沒有碼字的前綴是同其他碼字相同的.
3.5.2.3 其他的變長編碼
與哈夫曼和基于哈夫曼的編碼一樣,一些其他的VLC方法被用在了視頻編碼的程序中.基于哈夫曼編碼的一個很大的不利是它們對于傳輸錯誤是敏感的.在VLC序列的錯誤會導致解碼器損失同步信息,并不能正確地進行解碼,這樣就導致了使解碼處于混亂狀態.一個預定義的編碼表的缺點在于解碼端和編碼端必須保存同樣的碼表.一個可代替它的方式是用如果輸入的符號已知時可自生成碼的方法,比如說指數Golomb編碼法.
?
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jasonme/archive/2005/04/10/341902.aspx