视频流中的DTS、PTS到底是什么
視頻流中的DTS、PTS到底是什么
I、P、B 幀
要搞懂 DTS 和 PTS ,首先要先了解一下 I、P、B 幀。
- I 幀 : 幀內編碼幀 又稱intra picture,I 幀通常是每個 GOP(MPEG 所使用的一種視頻壓縮技術)的第一個幀,經過適度地壓縮,做為隨機訪問的參考點,可以當成圖象。I幀可以看成是一個圖像經過壓縮后的產物。可獨立解碼。
- P 幀 : 前向預測編碼幀 又稱predictive-frame,P 幀圖像只采用前向時間預測,可以提高壓縮效率和圖像質量。
- B 幀 : 雙向預測內插編碼幀 又稱bi-directional interpolated prediction frame,可以大大提高壓縮倍數。
I P B 幀的不同:
I 幀:自身可以通過視頻解壓算法解壓成一張單獨的完整的圖片。
P 幀:需要參考其前面的一個 I 幀 或者 P 幀來生成一張完整的圖片。
B 幀:則要參考其前一個 I 或者 P 幀及其后面的一個 P 幀來生成一張完整的圖片。
兩個 I frame 之間形成一個 GOP,在 x264 中同時可以通過參數來設定bf的大小,即:I 和 P 或者兩個 P 之間 B 的數量。
通過上述基本可以說明如果有 B frame 存在的情況下一個 GOP 的最后一個 frame 一定是 P.
這就帶來一個問題:在視頻流中,先到來的 B 幀無法立即解碼,需要等待它依賴的后面的 I、P 幀先解碼完成,這樣一來播放時間與解碼時間不一致了,順序打亂了,那這些幀該如何播放呢?這時就需要我們來了解另外兩個概念:DTS 和 PTS。
DTS、PTS
DTS、PTS 的概念如下所述:
- 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 對應的就是
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還不明白的話可以看下面的圖:
如上圖:
I frame 的解碼不依賴于任何的其它的幀.而 p frame 的解碼則依賴于其前面的 I frame 或者 P frame. B frame 的解碼則依賴于其前的最近的一個 I frame 或者 P frame 及其后的最近的一個 P frame.
音視頻同步:
上面說了視頻幀、DTS、PTS 相關的概念。我們都知道在一個媒體流中,除了視頻以外,通常還包括音頻。音頻的播放,也有 DTS、PTS 的概念,但是音頻沒有類似視頻中 B 幀,不需要雙向預測,所以音頻幀的 DTS、PTS 順序是一致的。
音頻視頻混合在一起播放,就呈現了我們常常看到的廣義的視頻。在音視頻一起播放的時候,我們通常需要面臨一個問題:怎么去同步它們,以免出現畫不對聲的情況。
要實現音視頻同步,通常需要選擇一個參考時鐘,參考時鐘上的時間是線性遞增的,編碼音視頻流時依據參考時鐘上的時間給每幀數據打上時間戳。在播放時,讀取數據幀上的時間戳,同時參考當前參考時鐘上的時間來安排播放。這里的說的時間戳就是我們前面說的 PTS。實踐中,我們可以選擇:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時鐘。
總結
以上是生活随笔為你收集整理的视频流中的DTS、PTS到底是什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac安装 ohmyzsh发生443错误
- 下一篇: FFmpeg 简介