天天看點

FFmpeg I, P, B幀和PTS, DTS時間戳的關系

FFmpeg裡有兩種時間戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp)。 顧名思義,前者是解碼的時間,後者是顯示的時間。要仔細了解這兩個概念,需要先了解FFmpeg中的packet和frame的概念。

FFmpeg中用AVPacket結構體來描述解碼前或編碼後的壓縮包,用AVFrame結構體來描述解碼後或編碼前的信号幀。 對于視訊來說,AVFrame就是視訊的一幀圖像。這幀圖像什麼時候顯示給使用者,就取決于它的PTS。DTS是AVPacket裡的一個成員,表示這個壓縮包應該什麼時候被解碼。 如果視訊裡各幀的編碼是按輸入順序(也就是顯示順序)依次進行的,那麼解碼和顯示時間應該是一緻的。可事實上,在大多數編解碼标準(如H.264或HEVC)中,編碼順序和輸入順序并不一緻。 于是才會需要PTS和DTS這兩種不同的時間戳。

基本概念:

I frame :幀内編碼幀 又稱intra picture,I 幀通常是每個 GOP(MPEG 所使用的一種視訊壓縮技術)的第一個幀,經過适度地壓縮,做為随機通路的參考點,可以當成圖象。I幀可以看成是一個圖像經過壓縮後的産物。

P frame: 前向預測編碼幀 又稱predictive-frame,通過充分将低于圖像序列中前面已編碼幀的時間備援資訊來壓縮傳輸資料量的編碼圖像,也叫預測幀;

B frame: 雙向預測内插編碼幀 又稱bi-directional interpolated prediction frame,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列後面已編碼幀之間的時間備援資訊來壓縮傳輸資料量的編碼圖像,也叫雙向預測幀;

PTS:Presentation Time Stamp。PTS主要用于度量解碼後的視訊幀什麼時候被顯示出來

DTS:Decode Time Stamp。DTS主要是辨別讀入記憶體中的bit流在什麼時候開始送入解碼器中進行解碼。

在沒有B幀存在的情況下DTS的順序和PTS的順序應該是一樣的。

IPB幀的不同:

I frame:自身可以通過視訊解壓算法解壓成一張單獨的完整的圖檔。

P frame:需要參考其前面的一個I frame 或者B frame來生成一張完整的圖檔。

B frame:則要參考其前一個I或者P幀及其後面的一個P幀來生成一張完整的圖檔。

兩個I frame之間形成一個GOP,在x264中同時可以通過參數來設定bf的大小,即:I 和p或者兩個P之間B的數量。

通過上述基本可以說明如果有B frame 存在的情況下一個GOP的最後一個frame一定是P.

DTS和PTS的不同:

DTS主要用于視訊的解碼,在解碼階段使用.PTS主要用于視訊的同步和輸出.在display的時候使用.在沒有B frame的情況下.DTS和PTS的輸出順序是一樣的.

例子:

下面給出一個GOP為15的例子,其解碼的參照frame及其解碼的順序都在裡面:

FFmpeg I, P, B幀和PTS, DTS時間戳的關系

如上圖:I frame 的解碼不依賴于任何的其它的幀.而p frame的解碼則依賴于其前面的I frame或者P frame.B frame的解碼則依賴于其前的最近的一個I frame或者P frame 及其後的最近的一個P frame.