视频流中的DTS、PTS到底是什么
視頻流中的DTS、PTS到底是什么
I、P、B 幀
要搞懂 DTS 和 PTS ,首先要先了解一下 I、P、B 幀。
- I 幀 : 幀內(nèi)編碼幀 又稱intra picture,I 幀通常是每個(gè) GOP(MPEG 所使用的一種視頻壓縮技術(shù))的第一個(gè)幀,經(jīng)過適度地壓縮,做為隨機(jī)訪問的參考點(diǎn),可以當(dāng)成圖象。I幀可以看成是一個(gè)圖像經(jīng)過壓縮后的產(chǎn)物。可獨(dú)立解碼。
- P 幀 : 前向預(yù)測(cè)編碼幀 又稱predictive-frame,P 幀圖像只采用前向時(shí)間預(yù)測(cè),可以提高壓縮效率和圖像質(zhì)量。
- B 幀 : 雙向預(yù)測(cè)內(nèi)插編碼幀 又稱bi-directional interpolated prediction frame,可以大大提高壓縮倍數(shù)。
I P B 幀的不同:
I 幀:自身可以通過視頻解壓算法解壓成一張單獨(dú)的完整的圖片。
P 幀:需要參考其前面的一個(gè) I 幀 或者 P 幀來生成一張完整的圖片。
B 幀:則要參考其前一個(gè) I 或者 P 幀及其后面的一個(gè) P 幀來生成一張完整的圖片。
兩個(gè) I frame 之間形成一個(gè) GOP,在 x264 中同時(shí)可以通過參數(shù)來設(shè)定bf的大小,即:I 和 P 或者兩個(gè) P 之間 B 的數(shù)量。
通過上述基本可以說明如果有 B frame 存在的情況下一個(gè) GOP 的最后一個(gè) frame 一定是 P.
這就帶來一個(gè)問題:在視頻流中,先到來的 B 幀無法立即解碼,需要等待它依賴的后面的 I、P 幀先解碼完成,這樣一來播放時(shí)間與解碼時(shí)間不一致了,順序打亂了,那這些幀該如何播放呢?這時(shí)就需要我們來了解另外兩個(gè)概念:DTS 和 PTS。
DTS、PTS
DTS、PTS 的概念如下所述:
- DTS(Decoding Time Stamp):即解碼時(shí)間戳,這個(gè)時(shí)間戳的意義在于告訴播放器該在什么時(shí)候解碼這一幀的數(shù)據(jù)。
- PTS(Presentation Time Stamp):即顯示時(shí)間戳,這個(gè)時(shí)間戳用來告訴播放器該在什么時(shí)候顯示這一幀的數(shù)據(jù)。
雖然 DTS、PTS 是用于指導(dǎo)播放端的行為,但它們是在編碼的時(shí)候由編碼器生成的。
在視頻采集的時(shí)候是錄制一幀就編碼一幀發(fā)送一幀的,在編碼的時(shí)候會(huì)生成 PTS,這里需要特別注意的是 frame(幀)的編碼方式,在通常的場(chǎng)景中,編解碼器編碼一個(gè) I 幀,然后向前跳過幾個(gè)幀,用編碼 I 幀作為基準(zhǔn)幀對(duì)一個(gè)未來 P 幀進(jìn)行編碼,然后跳回到 I 幀之后的下一個(gè)幀。編碼的 I 幀和 P 幀之間的幀被編碼為 B 幀。之后,編碼器會(huì)再次跳過幾個(gè)幀,使用第一個(gè) P 幀作為基準(zhǔn)幀編碼另外一個(gè) P 幀,然后再次跳回,用 B 幀填充顯示序列中的空隙。這個(gè)過程不斷繼續(xù),每 12 到 15 個(gè) P 幀和 B 幀內(nèi)插入一個(gè)新的 I 幀。P 幀由前一個(gè) I 幀或 P 幀圖像來預(yù)測(cè),而 B 幀由前后的兩個(gè) P 幀或一個(gè) I 幀和一個(gè) P 幀來預(yù)測(cè),因而編解碼和幀的顯示順序有所不同,如下所示:
假設(shè)這里視頻采集到的幀是這樣子的
I B B P B B P那么它的 PTS 對(duì)應(yīng)的就是
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這時(shí)候去解碼,也是按照收到的視頻流一幀一幀去解的了,接收一幀解碼一幀,因?yàn)樵诰幋a的時(shí)候已經(jīng)按照 I、B、P 的依賴關(guān)系編好了,接收到數(shù)據(jù)直接解碼就好了。
那么解碼的順序就是:
I P B B P B B DTS:1 2 3 4 5 6 7 PTS:1 4 2 3 7 5 6可以看到解碼出來對(duì)應(yīng)的 PTS 不是順序的,為了正確顯示視頻流,這時(shí)候我們就必須按照 PTS 調(diào)整解碼后的 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 的解碼則依賴于其前的最近的一個(gè) I frame 或者 P frame 及其后的最近的一個(gè) P frame.
音視頻同步:
上面說了視頻幀、DTS、PTS 相關(guān)的概念。我們都知道在一個(gè)媒體流中,除了視頻以外,通常還包括音頻。音頻的播放,也有 DTS、PTS 的概念,但是音頻沒有類似視頻中 B 幀,不需要雙向預(yù)測(cè),所以音頻幀的 DTS、PTS 順序是一致的。
音頻視頻混合在一起播放,就呈現(xiàn)了我們常常看到的廣義的視頻。在音視頻一起播放的時(shí)候,我們通常需要面臨一個(gè)問題:怎么去同步它們,以免出現(xiàn)畫不對(duì)聲的情況。
要實(shí)現(xiàn)音視頻同步,通常需要選擇一個(gè)參考時(shí)鐘,參考時(shí)鐘上的時(shí)間是線性遞增的,編碼音視頻流時(shí)依據(jù)參考時(shí)鐘上的時(shí)間給每幀數(shù)據(jù)打上時(shí)間戳。在播放時(shí),讀取數(shù)據(jù)幀上的時(shí)間戳,同時(shí)參考當(dāng)前參考時(shí)鐘上的時(shí)間來安排播放。這里的說的時(shí)間戳就是我們前面說的 PTS。實(shí)踐中,我們可以選擇:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時(shí)鐘。
總結(jié)
以上是生活随笔為你收集整理的视频流中的DTS、PTS到底是什么的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac安装 ohmyzsh发生443错误
- 下一篇: FFmpeg 简介