理解音视频 PTS 和 DTS
視頻
視頻的播放過(guò)程可以簡(jiǎn)單理解為一幀一幀的畫(huà)面按照時(shí)間順序呈現(xiàn)出來(lái)的過(guò)程,就像在一個(gè)本子的每一頁(yè)畫(huà)上畫(huà),然后快速翻動(dòng)的感覺(jué)。
但是在實(shí)際應(yīng)用中,并不是每一幀都是完整的畫(huà)面,因?yàn)槿绻恳粠?huà)面都是完整的圖片,那么一個(gè)視頻的體積就會(huì)很大,這樣對(duì)于網(wǎng)絡(luò)傳輸或者視頻數(shù)據(jù)存儲(chǔ)來(lái)說(shuō)成本太高,所以通常會(huì)對(duì)視頻流中的一部分畫(huà)面進(jìn)行壓縮(編碼)處理。由于壓縮處理的方式不同,視頻中的畫(huà)面幀就分為了不同的類別,其中包括:I 幀、P 幀、B 幀。
I、P、B 幀
I 幀、P 幀、B 幀的區(qū)別在于:
- I 幀(Intra coded frames):I 幀圖像采用幀內(nèi)編碼方式,即只利用了單幀圖像內(nèi)的空間相關(guān)性,而沒(méi)有利用時(shí)間相關(guān)性。I 幀使用幀內(nèi)壓縮,不使用運(yùn)動(dòng)補(bǔ)償,由于 I 幀不依賴其它幀,所以是隨機(jī)存取的入點(diǎn),同時(shí)是解碼的基準(zhǔn)幀。I 幀主要用于接收機(jī)的初始化和信道的獲取,以及節(jié)目的切換和插入,I 幀圖像的壓縮倍數(shù)相對(duì)較低。I 幀圖像是周期性出現(xiàn)在圖像序列中的,出現(xiàn)頻率可由編碼器選擇。
- P 幀(Predicted frames):P 幀和 B 幀圖像采用幀間編碼方式,即同時(shí)利用了空間和時(shí)間上的相關(guān)性。P 幀圖像只采用前向時(shí)間預(yù)測(cè),可以提高壓縮效率和圖像質(zhì)量。P 幀圖像中可以包含幀內(nèi)編碼的部分,即 P 幀中的每一個(gè)宏塊可以是前向預(yù)測(cè),也可以是幀內(nèi)編碼。
- B 幀(Bi-directional predicted frames):B 幀圖像采用雙向時(shí)間預(yù)測(cè),可以大大提高壓縮倍數(shù)。值得注意的是,由于 B 幀圖像采用了未來(lái)幀作為參考,因此 MPEG-2 編碼碼流中圖像幀的傳輸順序和顯示順序是不同的。
也就是說(shuō),一個(gè) I 幀可以不依賴其他幀就解碼出一幅完整的圖像,而 P 幀、B 幀不行。P 幀需要依賴視頻流中排在它前面的幀才能解碼出圖像。B 幀則需要依賴視頻流中排在它前面或后面的幀才能解碼出圖像。
這就帶來(lái)一個(gè)問(wèn)題:在視頻流中,先到來(lái)的 B 幀無(wú)法立即解碼,需要等待它依賴的后面的 I、P 幀先解碼完成,這樣一來(lái)播放時(shí)間與解碼時(shí)間不一致了,順序打亂了,那這些幀該如何播放呢?這時(shí)就需要我們來(lái)了解另外兩個(gè)概念:DTS 和 PTS。
DTS、PTS 的概念
DTS、PTS 的概念如下所述:
- DTS(Decoding Time Stamp):即解碼時(shí)間戳,這個(gè)時(shí)間戳的意義在于告訴播放器該在什么時(shí)候解碼這一幀的數(shù)據(jù)。
- PTS(Presentation Time Stamp):即顯示時(shí)間戳,這個(gè)時(shí)間戳用來(lái)告訴播放器該在什么時(shí)候顯示這一幀的數(shù)據(jù)。
需要注意的是:雖然 DTS、PTS 是用于指導(dǎo)播放端的行為,但它們是在編碼的時(shí)候由編碼器生成的。
當(dāng)視頻流中沒(méi)有 B 幀時(shí),通常 DTS 和 PTS 的順序是一致的。但如果有 B 幀時(shí),就回到了我們前面說(shuō)的問(wèn)題:解碼順序和播放順序不一致了。
比如一個(gè)視頻中,幀的顯示順序是:I B B P,現(xiàn)在我們需要在解碼 B 幀時(shí)知道 P 幀中信息,因此這幾幀在視頻流中的順序可能是:I P B B,這時(shí)候就體現(xiàn)出每幀都有 DTS 和 PTS 的作用了。DTS 告訴我們?cè)摪词裁错樞蚪獯a這幾幀圖像,PTS 告訴我們?cè)摪词裁错樞蝻@示這幾幀圖像。順序大概如下:
音視頻的同步
上面說(shuō)了視頻幀、DTS、PTS 相關(guān)的概念。我們都知道在一個(gè)媒體流中,除了視頻以外,通常還包括音頻。音頻的播放,也有 DTS、PTS 的概念,但是音頻沒(méi)有類似視頻中 B 幀,不需要雙向預(yù)測(cè),所以音頻幀的 DTS、PTS 順序是一致的。
音頻視頻混合在一起播放,就呈現(xiàn)了我們常常看到的廣義的視頻。在音視頻一起播放的時(shí)候,我們通常需要面臨一個(gè)問(wèn)題:怎么去同步它們,以免出現(xiàn)畫(huà)不對(duì)聲的情況。
要實(shí)現(xiàn)音視頻同步,通常需要選擇一個(gè)參考時(shí)鐘,參考時(shí)鐘上的時(shí)間是線性遞增的,編碼音視頻流時(shí)依據(jù)參考時(shí)鐘上的時(shí)間給每幀數(shù)據(jù)打上時(shí)間戳。在播放時(shí),讀取數(shù)據(jù)幀上的時(shí)間戳,同時(shí)參考當(dāng)前參考時(shí)鐘上的時(shí)間來(lái)安排播放。這里的說(shuō)的時(shí)間戳就是我們前面說(shuō)的 PTS。實(shí)踐中,我們可以選擇:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時(shí)鐘。
參考
- MPEG-2 Wiki
- MPEG-2 的同步及時(shí)間恢復(fù)
- Synching Video
總結(jié)
以上是生活随笔為你收集整理的理解音视频 PTS 和 DTS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nginx主模块指令
- 下一篇: AAC音频裸码流时间戳与时间长度的关系