I/P/B幀
I幀:關鍵幀,采用的是幀內壓縮技術
B幀:前后參考幀,它屬於幀間壓縮技術,在壓縮成B幀前,它會參考它前面的非壓縮視頻幀,和后面的非壓縮的視頻幀,紀錄下前后兩幀都不存放的殘差值,這樣可以達到更好的壓縮率。
P幀:向前參考幀,就是參考的是前一個關鍵幀的數據,P幀屬於幀間壓縮技術,相對於B幀,P幀的壓縮率要比B幀低
IDR幀:(instantaneous decoding refresh picture)
因為H264采用了多幀預測,所以I幀之后的P幀有可能會參考I幀之前的幀,這就使得隨機訪問的時候不能找到I幀作為參考條件,因為找到I幀,I幀之后的幀還是有可能解析不出來。而IDR幀就是一種特殊的I幀,即這一幀之后的所有參考幀只會參考到這個IDR幀,而不會參考前面的幀。在解碼器中,一旦收到IDR幀,就會立即清理參考幀緩沖區,並將IDR幀作為被參考的幀。
PTS/DTS
PTS:(Presentation TimeStamp)是渲染用的時間戳,也就是說,我們的視頻幀按照PTS的時間戳來展示的
DTS:(Decoding TimeStamp)解碼時間戳,是用於視頻解碼的
存在即合理,存在的原因:
第一行,實際應展示的順序:I B B P
第二行,實際在存放的順序:I P B B
第三行,按實際順序號展示:1 4 2 3
第四行,按實際順序號展示:1 2 3 4
解釋:實際展示的幀順序是I,B,P,P,解碼后的視頻幀,但實際上這些幀到達之后,P幀參考的是I幀,B幀是雙向參考幀,如果I幀和P幀沒有解碼的話,B幀是無法進行解碼的,基於這個問題就出現了PTS和DTS兩個時間戳。
時間基
有了時間戳之后,最終進行展示時還需要將PTS時間戳轉成以秒為單位的時間
通常在ffmpeg/ffplay命令時,分別是tbr,tbn,tbc
tbr:是我們通常說的幀率。 time base of rate
tbn:視頻流的時間基。time base of stream
tbc:視頻解碼的時間基。time base of codec
在ffmpeg中,不同的時間戳對應不同的時間基。對於視頻的渲染我們使用的是視頻流的時間基,也就是tbn
時間基即時間刻度,我們以幀率為例,每秒鍾的幀率是25幀,那么他的時間基就是1/25,也就是每隔1/25秒后,顯示一幀,假設我們當前時間為100,時間基是1/25,轉成秒就是 100 * 1/25 = 4