1. 程式人生 > >H264 資料幀理解(轉載總結)

H264 資料幀理解(轉載總結)

根據H.264的不同類別,編碼器會使用不同型別的幀,例如I幀、P幀和B幀。

I幀(幀內編碼幀)是一種自帶全部資訊的獨立幀,無需參考其它影象便可獨立進行解碼。視訊序列中的第一個幀始終都是I幀。如果所傳輸的位元流遭到破壞,則需要將I幀用作新檢視器的起始點或重新同步點。I幀可以用來實現快進、快退以及其它隨機訪問功能。如果新的客戶端將參與檢視視訊流,編碼器將以相同的時間間隔或者根據要求自動插入I幀。I幀的缺點在於它們會佔用更多的資料位,但從另一方面看,I幀不會產生可覺察的模糊現象。I幀是P幀和B幀的參考幀;I幀是組GOP的參考幀,在一組中只有一個I幀;不考慮運動向量,資料量比較大;

P幀(幀間預測編碼幀)需要參考前面的I幀和/或P幀的不同部分才能進行編碼。與I幀相比,P幀通常佔用更少的資料位

,但其缺點是,由於P幀對前面的P和I參考幀有著複雜的依賴性,因此對傳輸錯誤非常敏感。P幀屬於前向預測的幀間編碼,它只參考前面最靠近它 的I幀或者P幀。

H.264編解碼器中,量化引數QP和量化步長Qstep的關係

量化步長Qstep共有52個值。(對於亮度編碼而言)

量化引數QP是量化步長Qstep的序號,取值0~51。

QP取最小值0 時,表示量化最精細;相反,QP取最大值51時,表示量化是最粗糙的

Qstep隨著QP的增加而增加,QP每增加6,Qstep增加一倍。

對於色度編碼,QP的最大值是39。

、NAL全稱Network Abstract Layer, 即網路抽象層。
         在H.264/AVC視訊編碼標準中,整個系統框架被分為了兩個層面:視訊編碼層面(VCL)和網路抽象層面(NAL)。其中,前者負責有效表示視訊資料的內容,而後者則負責格式化資料並提供頭資訊,以保證資料適合各種通道和儲存介質上的傳輸。因此我們平時的每幀資料就是一個NAL單元(SPS與PPS除外)。在實際的H264資料幀中,往往幀前面帶有00 00 00 01 或 00 00 01分隔符,一般來說編碼器編出的首幀資料為PPS與SPS,接著為I幀……

如下圖:


2、如何判斷幀型別(是影象參考幀還是I、P幀等)?

     NALU型別是我們判斷幀型別的利器,從官方文件中得出如下圖:


我們還是接著看最上面圖的碼流對應的資料來層層分析,以00 00 00 01分割之後的下一個位元組就是NALU型別,將其轉為二進位制資料後,解讀順序為從左往右算,如下:
(1)第1位禁止位,值為1表示語法出錯
(2)第2~3位為參考級別
(3)第4~8為是nal單元型別

例如上面00000001後有67,68以及65

其中0x67的二進位制碼為:
0110 0111
4-8為00111,轉為十進位制7,參考第二幅圖:7對應序列引數集SPS

其中0x68的二進位制碼為:
0110 1000
4-8為01000,轉為十進位制8,參考第二幅圖:8對應影象引數集PPS

其中0x65的二進位制碼為:
0110 0101
4-8為00101,轉為十進位制5,參考第二幅圖:5對應IDR影象中的片(I幀)

所以判斷是否為I幀的演算法為: (NALU型別  & 0001  1111) = 5   即   NALU型別  & 31 = 5

比如0x65 & 31 = 5

三種幀的說明

———————–

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幀,這樣在相同位元速率下,可以提供更好的畫質。