H264編碼原理

2021-10-09 18:03:33 字數 2507 閱讀 9654

前言

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幀。

三種幀的說明

1、i幀

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

i幀特點:

1)它是乙個全幀壓縮編碼幀。它將全幀影象資訊進行jpeg壓縮編碼及傳輸;

2)解碼時僅用i幀的資料就可重構完整影象;

3)i幀描述了影象背景和運動主體的詳情;

4)i幀不需要參考其他畫面而生成;

5)i幀是p幀和b幀的參考幀(其質量直接影響到同組中以後各幀的質量);

6)i幀是幀組gop的基礎幀(第一幀),在一組中只有乙個i幀;

7)i幀不需要考慮運動向量;

8)i幀所佔資料的資訊量比較大。

2、p幀 

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幀的壓縮比較高。

3、b幀

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.yuv格式為yuv420 2.解析度為640 480 3.幀率為15 建議碼流500kbps,通過計算可以得到h264壓縮比約為1 100。gop中幀與幀之間的差別小 有失真壓縮包括幀內壓縮和幀間壓縮,幀內壓縮解決的是空域資料冗餘問題,幀間壓縮解決的是時域資料冗餘的問題。無失真壓縮包括dc...

h264編碼分析 哥倫布編碼

1 首先h264為什麼選用哥倫布編碼?因為h264協議為了節省bits,沒有規定字段表示資料字段長度 資料字段可以根據自身的實際值,可長可短,這樣可以大程度上的節省bit。2 無符號指數哥倫布編碼如何編碼的?在實際資料前面有幾個0就表示,有效資料位數是多少,理解為長度字段,然後資料數值 數值 1,因...

H 264編碼技術 二

3.32 complementary field pair 互補場對 互補的參考場對或互補的非參考場對的總稱。3.33 complementary non reference field pair 互補的非參考場對 兩個位於解碼順序上相繼的兩個訪問單元中非參考場,作為兩個具有相反的奇偶性編碼場,並且...