I幀、P幀、B幀、GOP、IDR 和PTS, DTS之間的關系


一.視頻傳輸原理

視頻是利用人眼視覺暫留的原理,通過播放一系列的圖片,使人眼產生運動的感覺。單純傳輸視頻畫面,視頻量非常大,對現有的網絡和存儲來說是不可接受的。為了能夠使視頻便於傳輸和存儲,人們發現視頻有大量重復的信息,如果將重復信息在發送端去掉,在接收端恢復出來,這樣就大大減少了視頻數據的文件,因此有了H.264視頻壓縮標准。

視頻里邊的原始圖像數據會采用 H.264編碼格式進行壓縮,音頻采樣數據會采用 AAC 編碼格式進行壓縮。視頻內容經過編碼壓縮后,確實有利於存儲和傳輸。不過當要觀看播放時,相應地也需要解碼過程。因此編碼和解碼之間,顯然需要約定一種編碼器和解碼器都可以理解的約定。就視頻圖像編碼和解碼而言,這種約定很簡單:

編碼器將多張圖像進行編碼后生產成一段一段的 GOP ( Group of Pictures ) , 解碼器在播放時則是讀取一段一段的 GOP 進行解碼后讀取畫面再渲染顯示。GOP ( Group of Pictures) 是一組連續的畫面,由一張 I 幀和數張 B / P 幀組成,是視頻圖像編碼器和解碼器存取的基本單位,它的排列順序將會一直重復到影像結束。I 幀是內部編碼幀(也稱為關鍵幀),P幀是前向預測幀(前向參考幀),B 幀是雙向內插幀(雙向參考幀)。簡單地講,I 幀是一個完整的畫面,而 P 幀和 B 幀記錄的是相對於 I 幀的變化。如果沒有 I 幀,P 幀和 B 幀就無法解碼。

在H.264壓縮標准中I幀、P幀、B幀用於表示傳輸的視頻畫面。

 

二. I幀、P幀、B幀,GOP

I幀

I幀:即Intra-coded picture(幀內編碼圖像幀),I幀表示關鍵幀,你可以理解為這一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因為包含完整畫面)。又稱為內部畫面 (intra picture),I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術)的第一個幀,經過適度地壓縮,做為隨機訪問的參考點,可以當成圖象。在MPEG編碼的過程中,部分視頻幀序列壓縮成為I幀;部分壓縮成P幀;還有部分壓縮成B幀。I幀法是幀內壓縮法,也稱為“關鍵幀”壓縮法。I幀法是基於離散余弦變換DCT(Discrete Cosine Transform)的壓縮技術,這種算法與JPEG壓縮算法類似。采用I幀壓縮可達到1/6的壓縮比而無明顯的壓縮痕跡。

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

【I幀編碼流程】
  (1)進行幀內預測,決定所采用的幀內預測模式。
  (2)像素值減去預測值,得到殘差。
  (3)對殘差進行變換和量化。
  (4)變長編碼和算術編碼。
  (5)重構圖像並濾波,得到的圖像作為其它幀的參考幀。

例如:在視頻會議系統中,終端發送給MCU(或者MCU發送給終端)的圖像,並不是每次都把完整的一幅幅圖片發送到遠端,而只是發送后一幅畫面在前一幅畫面基礎上發生變化的部分。如果在網絡狀況不好的情況下,終端的接收遠端或者發送給遠程的畫面就會有丟包而出現圖像花屏、圖像卡頓的現象,在這種情況下如果沒有I幀機制來讓遠端重新發一幅新的完整的圖像到本地(或者本地重新發一幅新的完整的圖像給遠端),終端的輸出圖像的花屏、卡頓現象會越來越嚴重,從而造成會議無法正常進行。
在視頻畫面播放過程中,若I幀丟失了,則后面的P幀也就隨着解不出來,就會出現視頻畫面黑屏的現象;若P幀丟失了,則視頻畫面會出現花屏、馬賽克等現象。
在視頻會議系統中I幀只會在會議限定的帶寬內發生,不會超越會議帶寬而生效。I幀機制不僅存在於MCU中,電視牆服務器、錄播服務器中也存在。就是為了解決在網絡狀況不好的情況下,出現的丟包而造成的如圖像花屏、卡頓,而影響會議會正常進行。

P幀

P幀:即Predictive-coded Picture(前向預測編碼圖像幀)。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幀:即Bidirectionally predicted picture(雙向預測編碼圖像幀)。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幀不是參考幀,不會造成解碼錯誤的擴散

為什么需要B幀

 從上面的看,我們知道I和P的解碼算法比較簡單,資源占用也比較少,I只要自己完成就行了,P呢,也只需要解碼器把前一個畫面緩存一下,遇到P時就使用之前緩存的畫面就好了,如果視頻流只有I和P,解碼器可以不管后面的數據,邊讀邊解碼,線性前進,大家很舒服。那么為什么還要引入B幀?

網絡上的電影很多都采用了B幀,因為B幀記錄的是前后幀的差別,比P幀能節約更多的空間,但這樣一來,文件小了,解碼器就麻煩了,因為在解碼時,不僅要用之前緩存的畫面,還要知道下一個I或者P的畫面(也就是說要預讀預解碼),而且,B幀不能簡單地丟掉,因為B幀其實也包含了畫面信息,如果簡單丟掉,並用之前的畫面簡單重復,就會造成畫面卡(其實就是丟幀了),並且由於網絡上的電影為了節約空間,往往使用相當多的B幀,B幀用的多,對不支持B幀的播放器就造成更大的困擾,畫面也就越卡。

【顯示和解碼順序示意圖】

 

GOP(序列)和IDR

在H264中圖像以序列為單位進行組織,一個序列是一段圖像編碼后的數據流。
一個序列的第一個圖像叫做 IDR 圖像立即刷新圖像),IDR 圖像都是 I 幀圖像。H.264 引入 IDR 圖像是為了解碼的重同步,當解碼器解碼到 IDR 圖像時,立即將參考幀隊列清空,將已解碼的數據全部輸出或拋棄,重新查找參數集,開始一個新的序列。這樣,如果前一個序列出現重大錯誤,在這里可以獲得重新同步的機會。IDR圖像之后的圖像永遠不會使用IDR之前的圖像的數據來解碼。
一個序列就是一段內容差異不太大的圖像編碼后生成的一串數據流。當運動變化比較少時,一個序列可以很長,因為運動變化少就代表圖像畫面的內容變動很小,所以就可以編一個I幀,然后一直P幀、B幀了。當運動變化多時,可能一個序列就比較短了,比如就包含一個I幀和3、4個P幀。
在視頻編碼序列中,GOP即Group of picture(圖像組),指兩個I幀之間的距離,Reference(參考周期)指兩個P幀之間的距離。兩個I幀之間形成一組圖片,就是GOP(Group Of Picture)。

三.PTS和DTS

【為什么會有PTS和DTS的概念】

通過上面的描述可以看出:P幀需要參考前面的I幀或P幀才可以生成一張完整的圖片,而B幀則需要參考前面I幀或P幀及其后面的一個P幀才可以生成一張完整的圖片。這樣就帶來了一個問題:在視頻流中,先到來的 B 幀無法立即解碼,需要等待它依賴的后面的 I、P 幀先解碼完成,這樣一來播放時間與解碼時間不一致了,順序打亂了,那這些幀該如何播放呢?這時就引入了另外兩個概念:DTS 和 PTS。

【PTS和DTS】

先來了解一下PTS和DTS的基本概念:

DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在於告訴播放器該在什么時候解碼這一幀的數據。
PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什么時候顯示這一幀的數據。

雖然 DTS、PTS 是用於指導播放端的行為,但它們是在編碼的時候由編碼器生成的。

在視頻采集的時候是錄制一幀就編碼一幀發送一幀的,在編碼的時候會生成 PTS,這里需要特別注意的是 frame(幀)的編碼方式,在通常的場景中,編解碼器編碼一個 I 幀,然后向后跳過幾個幀,用編碼 I 幀作為基准幀對一個未來 P 幀進行編碼,然后跳回到 I 幀之后的下一個幀。編碼的 I 幀和 P 幀之間的幀被編碼為 B 幀。之后,編碼器會再次跳過幾個幀,使用第一個 P 幀作為基准幀編碼另外一個 P 幀,然后再次跳回,用 B 幀填充顯示序列中的空隙。這個過程不斷繼續,每 12 到 15 個 P 幀和 B 幀內插入一個新的 I 幀。P 幀由前一個 I 幀或 P 幀圖像來預測,而 B 幀由前后的兩個 P 幀或一個 I 幀和一個 P 幀來預測,因而編解碼和幀的顯示順序有所不同,如下所示:

假設編碼器采集到的幀是這個樣子的:

 I B B P B B P 

那么它的顯示順序,也就是PTS應該是這樣:

 1 2 3 4 5 6 7  

編碼器的編碼順序是:

 1 4 2 3 7 5 6 

推流順序也是按照編碼順序去推的,即

 I P B B P B B 

那么接收斷收到的視頻流也就是

 I P B B P B B 

這時候去解碼,也是按照收到的視頻流一幀一幀去解的了,接收一幀解碼一幀,因為在編碼的時候已經按照 I、B、P 的依賴關系編好了,接收到數據直接解碼就好了。那么解碼順序是:

     I P B B P B B
DTS:1 2 3 4 5 6 7
PTS:1 4 2 3 7 5 6

可以看到解碼出來對應的 PTS 不是順序的,為了正確顯示視頻流,這時候我們就必須按照 PTS 重新調整解碼后的 frame(幀),即

     I B B P B B P
DTS:1 3 4 2 6 7 5
PTS:1 2 3 4 5 6 7

另外,並不是一定要使用B幀。在實時互動直播系統中,很少使用B幀。主要的原因是壓縮和解碼B幀時,由於要雙向參考,所以它需要緩沖更多的數據,且使用的CPU也會更高。由於實時性的要求,所以一般不使用它。不過對於播放器來說,遇到帶有B幀的H264數據是常有的事兒。在沒有B幀的情況下,存放幀的順序和顯示幀的順序就是一樣的,PTS和DTS的值也是一樣的。

 

參考鏈接:

1.視頻壓縮基本概念

2.視頻編碼之I幀 、P幀、B幀

3.IPB幀編碼順序(解碼順序)與顯示順序

4.DTS、PTS 解惑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM