視頻幀的概念


一、視頻幀

在H264協議里,圖像以組(GOP,也就是一個序列)為單位進行組織,一個組是一段圖像編碼后的數據流,以I幀開始,到下一個I幀結束。一個組就是一段內容差異不太大的圖像編碼后生成的一串數據流。當運動變化比較少時,一個組可以很長,因為運動變化少就代表圖像畫面的內容變動很小,所以就可以編一個I幀,然后一直P幀、B幀了。當運動變化多時,可能一個序列就比較短了,比如就包含一個I幀和3、4個P幀。

1.I幀

I幀是幀組的第一幀,在一組中只有一個I幀。I幀是幀內編碼幀,是一種自帶全部信息的獨立幀,無需參考其他圖像便可獨立進行解碼,可以簡單理解為一張靜態畫面。如果傳輸過程中I真丟失,畫面最直接的影響就是會卡頓,因為后面的幀都無法正確解碼,只能等待下一個GOP。

2.P幀

P幀是幀間預測編碼幀,需要參考其前面的I幀或P幀才能進行編碼。P幀沒有完整的畫面數據,只有與其前一參考幀的畫面差別的數據。與I幀相比,P幀通常占用更少的數據位,但不足是,由於P幀對前面的P和I參考幀有着復雜的依耐性,因此對傳輸錯誤非常敏感,所以如果P幀丟失,畫面會出現馬賽克現象,因為前向參考幀錯誤,補齊的並不是真正運動變化后的數據。

3.B幀

B幀是雙向預測編碼幀,也就是B幀記錄的是本幀與前后幀的差別。也就是說要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之后的畫面,通過前后畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但解碼時很耗CPU資源。(B幀以前面的I或P幀和后面的P幀為參考幀,B幀不是參考幀,不會造成解碼錯誤的擴散。)


一般來說,I幀的壓縮率是7(跟JPG差不多),P幀是20,B幀可以達到50。雖然B幀壓縮率高,但是在直播系統中很少使用B幀,一是因為解碼很耗CPU,再就是B幀解碼需要等待下一個P幀數據,這就會造成解碼延時,而直播系統對延時要求很高,所以一般不用B幀。但對於點播系統就不會有這個問題。

二、PTS和DTS

PTS(Presentation TimeStamp)是渲染用的時間戳,也就是說,我們的視頻幀是按照 PTS 的時間戳來展示的。DTS(Decoding TimeStamp)解碼時間戳,是用於視頻解碼的。
為什么會有2個不同的時間戳呢?這和I幀、P幀和B幀有關,我們分2中情況來看:

1.視頻中只有I幀和P幀

如下所示,第1幀是I幀,2-8幀是P幀,展示的順序是12345678。解碼時先解碼第1幀,第2幀參考第1幀解碼,第3幀參考第2幀解碼……也就是解碼順序也是12345678。這種情況下PTS和DTS是一樣的,所以此時是沒有必要區分2個不同的時間戳的。

1 2 3 4 5 6 7 8
I P P P P P P P

2.視頻中有I幀、P幀和B幀時

如下所示,第1幀是I幀,第4、8幀是P幀,其余是B幀,展示順序是12345678。解碼時先解第1幀,第2幀是B幀,由於它后面的幀還沒解碼,所以它也沒法解碼,第3幀也是一樣,所以第二解碼是第4號的P幀,然后2號B幀參考其前面的第1幀和其后面的第4幀進行解碼,然后再是3號B幀解碼,然后567號B幀要等到8號的P幀解碼后才能解碼。所以解碼的順序是14238567,這種情況下展示順序和解碼順序就不一樣,所以就有了PTS和DTS的區分。

1 2 3 4 5 6 7 8
I B B P B B B P


 


免責聲明!

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



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