H.264之I,P,B幀

壓縮比:壓縮後的數據量與壓縮前的數據量之比

預測編碼:主要是利用圖像相鄰的幀之間的相似性來實現編碼的;

I幀是基本幀,完整保留;壓縮率10

P幀,前向預測編碼,是在I 幀的基礎上取與I 幀的差異,壓縮率20

B幀是雙向預測內插編碼幀,也就是B幀記錄的是本幀與前後幀的差別,B幀的壓縮率高,但是解碼時CPU會比較累;壓縮率50



1、預測編碼     

      壓縮算法的本質就是去除信號間的冗餘,什麼是信號的冗餘呢?信號之間的相關性就是冗餘,人類聽覺或視覺系統感覺不到的或者掩蔽的也可以當做冗餘成分。今天談談預測編碼的概念,這是一種非常直觀和簡單易行的方法。說它直觀,以圖像爲例,前後兩幀或者同一圖像的相鄰像素都存在着相似性、相關性,我們完全可以通過當前幀和一組預測係數,推測出下一幀圖像,當然也可以從當前像素推測出周圍像素的變化。通過實際值與預測值的差,去除了一部分冗餘,使得信號的動態範圍變小了,表示這些信號的比特數減少了,從而達到壓縮的目的。

 

      對於視頻信號的預測編碼分成兩種,一個是幀間預測編碼,一個是幀內預測編碼。幀內預測是從空間上去除同一幀圖像內宏塊之間的冗餘。H264中,有4x4亮度預測模式、16x16亮度預測模式、8x8色度塊預測模式以及一種I_PCM編碼模式,如何選擇最優的編碼模型是一個不太容易的問題。

 

      幀間預測編碼效率比幀內編碼要高,它是從時間上去除圖像幀與幀之間的冗餘,分爲單向預測、雙向預測。一般雙向預測會增加編碼延時,所以在實時通信中用的不多。在幀間預測中,就不得不提運動估計這個概念,在活動圖像鄰近幀中的景物會發生空間上的位移,得到這個運動偏移的過程就是運動估計,涉及到各種搜索算法,同時這一部分的複雜度也是H264的重點。


2、變換編碼

     變換編碼是指將空間域的圖像變換到頻域,這樣會產生相關性很小的一些變換系數,並對其進行壓縮編碼。通常採用DCT變換,因爲它的性能接近K-L變換,同時具有快速算法,非常適合圖像變換編碼。變換編碼比預測編碼要複雜,但是各種誤差(量化、信道誤差)不會向後面擴展,對視覺影響不大。

 

3、熵編碼

     利用信源的統計特性進行碼率壓縮的編碼稱爲熵編碼。特點是無損編碼,但是壓縮率比較低,一般用在變換編碼後面作進一步壓縮。常用的有變長編碼(huffman編碼)和算術編碼。

1) 變長編碼

     對出現概率大的符號分配短字長的二進制碼,對出現概率小的符號分配長字長的二進制碼,得到符號平均碼長最短的碼。也稱爲最佳編碼。

2) 算術編碼

     與huffman編碼不同,不採用碼字表示輸入符號的方法,而是採用一個浮點數來代替一串輸入符號,經算術編碼後輸出一個小於1,大於等於0的浮點數,在解碼端在進行唯一的解碼,恢復原符號序列。

     這兩種編碼方法實際應用中都有受硬件精度的問題,即如何定點化表示小數的問題。


轉自http://blog.csdn.net/yangzhongxuan/article/details/8003504

      H264是新一代的編碼標準,以高壓縮高質量和支持多種網絡的流媒體傳輸著稱,在編碼方面,我理解的他的理論依據是:參照一段時間內圖像的統計結果表明,在相鄰幾幅圖像畫面中,一般有差別的像素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內。所以對於一段變化不大圖像畫面,我們可以先編碼出一個完整的圖像幀A,隨後的B幀就不編碼全部圖像,只寫入與A幀的差別,這樣B幀的大小就只有完整幀的1/10或更小!B幀之後的C幀如果變化不大,我們可以繼續以參考B的方式編碼C幀,這樣循環下去。這段圖像我們稱爲一個序列(序列就是有相同特點的一段數據),當某個圖像與之前的圖像變化很大,無法參考前面的幀來生成,那我們就結束上一個序列,開始下一段序列,也就是對這個圖像生成一個完整幀A1,隨後的圖像就參考A1生成,只寫入與A1的差別內容。

        在H264協議裏定義了三種幀,完整編碼的幀叫I幀,參考之前的I幀生成的只包含差異部分編碼的幀叫P幀,還有一種參考前後的幀編碼的幀叫B幀。

        H264採用的核心算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法。

----------------------

序列的說明

----------------------

        在H264中圖像以序列爲單位進行組織,一個序列是一段圖像編碼後的數據流,以I幀開始,到下一個I幀結束。

        一個序列的第一個圖像叫做 IDR 圖像(立即刷新圖像),IDR 圖像都是 I 幀圖像。H.264 引入 IDR 圖像是爲了解碼的重同步,當解碼器解碼到 IDR 圖像時,立即將參考幀隊列清空,將已解碼的數據全部輸出或拋棄,重新查找參數集,開始一個新的序列。這樣,如果前一個序列出現重大錯誤,在這裏可以獲得重新同步的機會。IDR圖像之後的圖像永遠不會使用IDR之前的圖像的數據來解碼。

        一個序列就是一段內容差異不太大的圖像編碼後生成的一串數據流。當運動變化比較少時,一個序列可以很長,因爲運動變化少就代表圖像畫面的內容變動很小,所以就可以編一個I幀,然後一直P幀、B幀了。當運動變化多時,可能一個序列就比較短了,比如就包含一個I幀和3、4個P幀。

-----------------------

三種幀的說明

-----------------------

I幀:幀內編碼幀 ,I幀表示關鍵幀,你可以理解爲這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因爲包含完整畫面)

I幀特點: 
1.它是一個全幀壓縮編碼幀。它將全幀圖像信息進行JPEG壓縮編碼及傳輸; 
2.解碼時僅用I幀的數據就可重構完整圖像; 
3.I幀描述了圖像背景和運動主體的詳情; 
4.I幀不需要參考其他畫面而生成; 
5.I幀是P幀和B幀的參考幀(其質量直接影響到同組中以後各幀的質量); 
6.I幀是幀組GOP的基礎幀(第一幀),在一組中只有一個I幀; 
7.I幀不需要考慮運動矢量; 
8.I幀所佔數據的信息量比較大。 


P幀:前向預測編碼幀。P幀表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)

 
P幀的預測與重構:P幀是以I幀爲參考幀,在I幀中找出P幀“某點”的預測值和運動矢量,取預測差值和運動矢量一起傳送。在接收端根據運動矢量從I幀中找出P幀“某點”的預測值並與差值相加以得到P幀“某點”樣值,從而可得到完整的P幀。
P幀特點: 
1.P幀是I幀後面相隔1~2幀的編碼幀; 
2.P幀採用運動補償的方法傳送它與前面的I或P幀的差值及運動矢量(預測誤差); 
3.解碼時必須將I幀中的預測值與預測誤差求和後才能重構完整的P幀圖像; 
4.P幀屬於前向預測的幀間編碼。它只參考前面最靠近它的I幀或P幀; 
5.P幀可以是其後面P幀的參考幀,也可以是其前後的B幀的參考幀; 
6.由於P幀是參考幀,它可能造成解碼錯誤的擴散; 
7.由於是差值傳送,P幀的壓縮比較高。 

B幀:雙向預測內插編碼幀。B幀是雙向差別幀,也就是B幀記錄的是本幀與前後幀的差別(具體比較複雜,有4種情況,但我這樣說簡單些),換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累。
 
B幀的預測與重構 
B幀以前面的I或P幀和後面的P幀爲參考幀,“找出”B幀“某點”的預測值和兩個運動矢量,並取預測差值和運動矢量傳送。接收端根據運動矢量在兩個參考幀中“找出(算出)”預測值並與差值求和,得到B幀“某點”樣值,從而可得到完整的B幀。
B幀特點 
1.B幀是由前面的I或P幀和後面的P幀來進行預測的; 
2.B幀傳送的是它與前面的I或P幀和後面的P幀之間的預測誤差及運動矢量; 
3.B幀是雙向預測編碼幀; 
4.B幀壓縮比最高,因爲它只反映丙參考幀間運動主體的變化情況,預測比較準確; 
5.B幀不是參考幀,不會造成解碼錯誤的擴散。 

注:I、B、P各幀是根據壓縮算法的需要,是人爲定義的,它們都是實實在在的物理幀。一般來說,I幀的壓縮率是7(跟JPG差不多),P幀是20,B幀可以達到50。可見使用B幀能節省大量空間,節省出來的空間可以用來保存多一些I幀,這樣在相同碼率下,可以提供更好的畫質。

--------------------------------

壓縮算法的說明

--------------------------------

h264的壓縮方法:

1.分組:把幾幀圖像分爲一組(GOP,也就是一個序列),爲防止運動變化,幀數不宜取多。 
2.定義幀:將每組內各幀圖像定義爲三種類型,即I幀、B幀和P幀; 
3.預測幀:以I幀做爲基礎幀,以I幀預測P幀,再由I幀和P幀預測B幀; 
4.數據傳輸:最後將I幀數據與預測的差值信息進行存儲和傳輸。

        幀內(Intraframe)壓縮也稱爲空間壓縮(Spatial compression)。當壓縮一幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗餘信息,這實際上與靜態圖像壓縮類似。幀內一般採用有損壓縮算法,由於幀內壓縮是編碼一個完整的圖像,所以可以獨立的解碼、顯示。幀內壓縮一般達不到很高的壓縮,跟編碼jpeg差不多。  

        幀間(Interframe)壓縮的原理是:相鄰幾幀的數據有很大的相關性,或者說前後兩幀信息變化很小的特點。也即連續的視頻其相鄰幀之間具有冗餘信息,根據這一特性,壓縮相鄰幀之間的冗餘量就可以進一步提高壓縮量,減小壓縮比。幀間壓縮也稱爲時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的數據進行壓縮。幀間壓縮一般是無損的。幀差值(Frame differencing)算法是一種典型的時間壓縮法,它通過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少數據量。

       順便說下有損(Lossy )壓縮和無損(Lossy less)壓縮。無損壓縮也即壓縮前和解壓縮後的數據完全一致。多數的無損壓縮都採用RLE行程編碼算法。有損壓縮意味着解壓縮後的數據與壓縮前的數據不一致。在壓縮的過程中要丟失一些人眼和人耳所不敏感的圖像或音頻信息,而且丟失的信息不可恢復。幾乎所有高壓縮的算法都採用有損壓縮,這樣才能達到低數據率的目標。丟失的數據率與壓縮比有關,壓縮比越小,丟失的數據越多,解壓縮後的效果一般越差。此外,某些有損壓縮算法採用多次重複壓縮的方式,這樣還會引起額外的數據丟失。




編解碼時候,如果丟失了I 幀,那麼就會造成嚴重的馬賽克現象;如果丟失了P幀或者B幀,丟一幀都會出現馬賽克現象;如果幀丟失了,也有辦法進行掩蓋的,

差錯掩蓋:利用自然景物的低頻特性儘可能恢復受損圖像,使差錯在視覺上儘量不被察覺將誤碼的損害降低到最低,在實時通信中;

差錯掩蓋技術分爲頻域,空域,時域3種掩蓋方法以及這三種方法相結合的混合法和自適應差錯掩蓋法

基於頻域的差錯掩蓋技術是指視頻傳輸出錯後,解碼端利用鄰近圖像塊在頻譜上的相關信息進行差錯掩蓋,根據宏塊中已正確解碼的DCT(discrete cosine transform)係數,利用鄰近塊DCT係數插值加邊界平滑約束條件對受損的DCT係數進行恢復計算,後面擴展到二階平滑,可以明顯減少模糊效應,能夠獲得較好質量的圖像,但是該方法實現困難,算法複雜,運算時間大;

空域差錯掩蓋:根據正確接收到的圖像信息以及內在的相關性,用空間相鄰的數據來恢復受損區域,利用相鄰像素進行雙向內插,這種利用圖像受損區域連續性方法的缺點是在具有特殊紋理的運動區域以及物體邊界處,容易造成掩蓋失敗;

時域差錯掩蓋:利用視頻序列的時間相關性,對受損區域用相關幀的數據替代,其難點是必須正確的估算出丟失的運動向量;

對於幀內編碼模式的宏塊,或場景變換的宏塊,如I幀中宏塊,可分別在空域和頻域插值以恢復其紋理信息,視頻序列中非場景切換的I幀,可嘗試將時域或時空域結合的辦法恢復受損宏塊的紋理信息;幀間編碼模式的宏塊,如P幀或B幀中的宏塊,採用時域運動補償替代的掩蓋方法,對於那些無法得知編碼模式的宏塊,採用時域掩蓋方法,效果要好於其他方法,


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章