音視頻 H264中的時間戳( DTS和PTS)
H264里有兩種時間戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp)。
顧名思義,前者是解碼的時間,后者是顯示的時間。要仔細(xì)理解這兩個概念,需要先了解FFmpeg中的packet和frame的概念。
FFmpeg中用AVPacket結(jié)構(gòu)體來描述解碼前或編碼后的壓縮包,用AVFrame結(jié)構(gòu)體來描述解碼后或編碼前的信號幀。 對于視頻來說,AVFrame就是視頻的一幀圖像。這幀圖像什么時候顯示給用戶,就取決于它的PTS。DTS是AVPacket里的一個成員,表示這個壓縮包應(yīng)該什么時候被解碼。 如果視頻里各幀的編碼是按輸入順序(也就是顯示順序)依次進(jìn)行的,那么解碼和顯示時間應(yīng)該是一致的??墒聦?shí)上,在大多數(shù)編解碼標(biāo)準(zhǔn)(如H.264或HEVC)中,編碼順序和輸入順序并不一致。 于是才會需要PTS和DTS這兩種不同的時間戳。
這就需要深入了解I B P三種幀類型與 DTS PTS的關(guān)系
I,P,B幀和PTS,DTS的關(guān)系
基本概念:
I frame :幀內(nèi)編碼幀 又稱intra picture,I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術(shù))的第一個幀,經(jīng)過適度地壓縮,做為隨機(jī)訪問的參考點(diǎn),可以當(dāng)成圖象。I幀可以看成是一個圖像經(jīng)過壓縮后的產(chǎn)物。
P frame: 前向預(yù)測編碼幀 又稱predictive-frame,通過充分將低于圖像序列中前面已編碼幀的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫預(yù)測幀;
B frame: 雙向預(yù)測內(nèi)插編碼幀 又稱bi-directional interpolated prediction frame,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列后面已編碼幀之間的時間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫雙向預(yù)測幀;
PTS:Presentation Time Stamp。PTS主要用于度量解碼后的視頻幀什么時候被顯示出來
DTS:Decode Time Stamp。DTS主要是標(biāo)識讀入內(nèi)存中的bit流在什么時候開始送入解碼器中進(jìn)行解碼。
在沒有B幀存在的情況下DTS的順序和PTS的順序應(yīng)該是一樣的。
IPB幀的不同:
I frame:自身可以通過視頻解壓算法解壓成一張單獨(dú)的完整的圖片。
P frame:需要參考其前面的一個I frame 或者P frame來生成一張完整的圖片。
B frame:則要參考其前一個I或者P幀及其后面的一個P幀來生成一張完整的圖片。
兩個I frame之間形成一個GOP,在x264中同時可以通過參數(shù)來設(shè)定bf的大小,即:I 和p或者兩個P之間B的數(shù)量。
通過上述基本可以說明如果有B frame 存在的情況下一個GOP的最后一個frame一定是P.
DTS和PTS的不同:
DTS主要用于視頻的解碼,在解碼階段使用.PTS主要用于視頻的同步和輸出.在display的時候使用.在沒有B frame的情況下.DTS和PTS的輸出順序是一樣的.
例子:
下面給出一個GOP為15的例子,其解碼的參照frame及其解碼的順序都在里面:

如上圖:I frame 的解碼不依賴于任何的其它的幀.而p frame的解碼則依賴于其前面的I frame或者P frame。B frame的解碼則依賴于其前的最近的一個I frame或者P frame 及其后的最近的一個P frame。
這2個概念經(jīng)常出現(xiàn)在音頻視頻編碼和播放中,其實(shí)際意義是,PTS是真正錄制和播放的時間戳,而DTS是解碼的時間戳。
對于普通的無B楨視頻(H264 Baseline或者VP8),PTS/DTS應(yīng)該是相等的,因?yàn)闆]有延遲編碼。
對于有B楨的視頻,I楨的PTS依然等于DTS, P楨的PTS>DTS, B楨的PTS<DTS。
可以簡單地這樣理解:
若視頻沒有B幀,則I和P都是解碼后即刻顯示。
若視頻含有B幀,則I是解碼后即刻顯示,P是先解碼后顯示,B是后解碼先顯示。(B 和P的先、后是相對的)。
from:http://blog.csdn.net/aflyeaglenku/article/details/70171371
相關(guān)視頻: