1. 程式人生 > >h264 Gop組 I 、P、B 幀

h264 Gop組 I 、P、B 幀

H.264視訊資料組織結構-GOP影象組和組中3類不同的影象幀  

前言

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

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

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

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

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

GOP說白了就是兩個I幀之間的間隔.比較說GOP為120,如果是720p60的話,那就是2s一次I幀.gop一般設定為幀率的2倍。

徐立:關鍵幀間隔越長,也就是 GOP 越長,理論上畫面越高清。但是生成 HLS 直播時,最小切割粒度也是一個 GOP,所以針對互動直播,通常不建議 GOP 設定太長。直播一般 2 個關鍵幀間隔即可。比如幀率是 24fps, 那麼 2 個關鍵幀的間隔就是 48fps ,這個 GOP 就是2s。


視訊資料組織結構

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

 

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

GOP影象組的說明

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

在H264中影象以GOP影象組為單位進行組織,一個GOP影象組是一段影象編碼後的資料流,以I幀開始,到下一個I幀結束。

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

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

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

三種幀的說明

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

I幀:

幀內編碼幀,I幀表示關鍵幀,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀資料就可以完成(因為包含完整畫面),一個GOP中,I幀是編解碼的起點,有效防止幀間預測誤差累計擴散。

I幀特點:

1.它是一個全幀壓縮編碼幀。它將全幀影象資訊進行H.26L壓縮編碼及傳輸(效果全面超越JPEG,逼近甚至超過JPEG2000);

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幀不用作參考幀。B幀是雙向差別幀,也就是B幀記錄的是本幀與前後幀的差別,換言之,要解碼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幀,這樣在相同位元速率下,可以提供更好的畫質。

4. OBS 推流,播放端 HLS 出現視/音訊不同步是哪個環節的問題?怎麼優化?
徐立:有可能是採集端的問題,如果是採集端編碼環節就出現音畫不同步,可以在收流伺服器上做音畫時間戳同步,這樣是全域性的校對如果是播放端解碼效能問題,那麼需要調節播放邏輯,比如保證音畫時間戳強一致性的前提下,選擇性丟一部幀。