TS流的解码过程-ES-PES-DTS-PTS-PCR
from: http://blog.chinaunix.net/uid-9688646-id-1998407.html
TS 流解碼過(guò)程:
1. 獲取TS中的PAT
2. 獲取TS中的PMT
3. 根據(jù)PMT可以知道當(dāng)前網(wǎng)絡(luò)中傳輸?shù)囊曨l(音頻)類型(H264),相應(yīng)的PID,PCR的PID等信息。
4. 設(shè)置demux 模塊的視頻Filter 為相應(yīng)視頻的PID和stream type等。
5.從視頻Demux Filter 后得到的TS數(shù)據(jù)包中的payload 數(shù)據(jù)就是 one piece of PES,在TSheader中有一些關(guān)于此 payload屬于哪個(gè) PES的 第多少個(gè)數(shù)據(jù)包。因此軟件中應(yīng)該將此payload中的數(shù)據(jù)copy到PES的buffer中,用于拼接一個(gè)PES包。
6. 拼接好的PES包的包頭會(huì)有 PTS,DTS信息,去掉PES的header就是 ES。
7. 直接將 被被拔掉 PES包頭的ES包送給decoder就可以進(jìn)行解碼。解碼出來(lái)的數(shù)據(jù)就是一幀一幀的視頻數(shù)據(jù),這些數(shù)據(jù)至少應(yīng)當(dāng)與PES中的PTS關(guān)聯(lián)一下,以便進(jìn)行視音頻同步。
8. I,B,B,P 信息是在ES中的。
?
ES是直接從編碼器出來(lái)的數(shù)據(jù)流,可以是編碼過(guò)的視頻數(shù)據(jù)流,音頻數(shù)據(jù)流,或其他編碼數(shù)據(jù)流的統(tǒng)稱。ES流經(jīng)過(guò)PES打包器之后,被轉(zhuǎn)換成PES包。PES包由包頭和payload組成.
在PES層,主要是在PES包頭信息中加入PTS(顯示時(shí)間標(biāo)簽)和DTS(解碼時(shí)間標(biāo)簽)用于視頻、音頻同步。其實(shí),Mpeg-2用于視音頻同步以及系統(tǒng)時(shí)鐘恢復(fù)的時(shí)間標(biāo)簽分別在ES,PES和TS這3個(gè)層次中。在ES層,與同步有關(guān)的主要是視頻緩沖驗(yàn)證VBV(Video Buffer Verifier),用以防止解碼器的緩沖器出現(xiàn)上溢或下溢;在PES層,主要是在PES頭信息里出現(xiàn)的顯示時(shí)間標(biāo)簽PTS(Presentation Time Stamp)和解碼時(shí)間標(biāo)簽DTS(Decoding Time Stamp);在TS層中,TS頭信息包含了節(jié)目時(shí)鐘參考PCR(Program Clock Reference),用于恢復(fù)出與編碼端一致的系統(tǒng)時(shí)序時(shí)鐘STC(System Time Clock)。
基本流程如下:首先MPEG-2壓縮編碼得到的ES基本流,這個(gè)數(shù)據(jù)流很大,并且只是I,P,B的這些視頻幀或音頻取樣信息,然后加入一些同步信息,打包成長(zhǎng)度可變長(zhǎng)度的數(shù)據(jù)包PES,原來(lái)是流的格式,現(xiàn)在成了數(shù)據(jù)包的分割形式。同時(shí)要注意的是,ES是只包含一種內(nèi)容的數(shù)據(jù)流,如只含視頻,或只含音頻等,打包之后的PES也是只含一種性質(zhì)的ES,如只含視頻ES的PES,只含音頻ES的PES等。可以知道,ES是編碼視頻數(shù)據(jù)流或音頻數(shù)據(jù)流,每個(gè)ES都由若干個(gè)存取單元(AU)組成,每個(gè)視頻AU或音頻AU都是由頭部和編碼數(shù)據(jù)兩部分組成,1個(gè)AU相當(dāng)于編碼的1幅視頻圖像或1個(gè)音頻幀,也可以說(shuō),每個(gè)AU實(shí)際上是編碼數(shù)據(jù)流的顯示單元,即相當(dāng)于解碼的1幅視頻圖像或1個(gè)音頻幀的取樣。PEG-2對(duì)視頻的壓縮產(chǎn)生I幀、P幀、B幀。把幀順序I1,P4,B2,B3,P7,B5,B6幀的編碼ES,通過(guò)打包并在每個(gè)幀中插入?PTS/DTS標(biāo)志,變成PES。在插入PTS/DTS標(biāo)志時(shí),由于在B幀PTS和DTS相等,所以無(wú)須在B幀多插入DTS。而對(duì)于I幀?和P幀,由于經(jīng)過(guò)復(fù)用后數(shù)據(jù)包的順序會(huì)發(fā)生變化,顯示前一定要存儲(chǔ)于視頻解碼器的從新排序緩存器中,經(jīng)過(guò)從新排序后再顯示,所以一定要同時(shí)插入PTS和?DTS作為從新排序的依據(jù)。
?
其中,有否PTS/DTS標(biāo)志,是解決視音頻同步顯示、防止解碼器輸入緩存器上溢或下溢的關(guān)鍵所在。PTS表明顯示單元出現(xiàn)在系統(tǒng)目標(biāo)解碼器(STD- System?Target?Decoder)的時(shí)間,?DTS表明將存取單元全部字節(jié)從STD的ES解碼緩存器移走的時(shí)刻。視頻編碼圖像幀次序?yàn)?/span>?I1,P4,B2,B3,P7,B5,B6,I10,B8,B9的ES,加入PTS/DTS后,打包成一個(gè)個(gè)視頻PES包。每個(gè)PES包都有一個(gè)包頭,用于定義PES內(nèi)的數(shù)據(jù)內(nèi)容,提供定時(shí)資料。每個(gè)I、P、B幀的包頭都有一個(gè)PTS和DTS,但PTS與DTS對(duì)B幀都是一樣的,無(wú)須標(biāo)出B幀的DTS。對(duì)I幀和P幀,顯示前一定要存儲(chǔ)于視頻解碼器的重新排序緩存器中,經(jīng)過(guò)延遲(重新排序)后再顯示,一定要分別標(biāo)明PTS和DTS。例如,解碼器輸入的圖像幀次序?yàn)?/span>I1,P4,B2,B3,P7,B5,B6,I10,B8,B9,依解碼器輸出的幀次序,應(yīng)該P4比B2、B3在先,但顯示時(shí)P4一定要比B2、B3在后,即P4要在提前插入數(shù)據(jù)流中的時(shí)間標(biāo)志指引下,經(jīng)過(guò)緩存器重新排序,以重建編碼前視頻幀次序I1,B2,B3,P4,B5,B6,P7,B8,B9,I10。顯然,PTS/DTS標(biāo)志表明對(duì)確定事件或確定信息解碼的專用時(shí)標(biāo)的存在,依靠專用時(shí)標(biāo)解碼器,可知道該確定事件或確定信息開(kāi)始解碼或顯示的時(shí)刻。例如,PTS/DTS標(biāo)志可用于確定編碼、多路復(fù)用、解碼、重建的時(shí)間。
?????? PCR??
PCR是TS里面的,即TS packet的header里面可能會(huì)有,他用來(lái)指定所期望的該ts packet到達(dá)decoder的時(shí)間,他的作用于SCR類似。
DTS, PTS
對(duì)于一個(gè)ES來(lái)說(shuō),比如視頻,他又許多I,P,B幀,而P, B幀都是以I,P幀作為參考。由于B幀是前向后向參考,因此要對(duì)B幀作decode的話,就必須先decode該B幀后面的P,或者I幀,于是,decode的時(shí)間與幀的真正的present的時(shí)間就不一致了,按照DTS一次對(duì)各個(gè)幀進(jìn)行decode,然后再按照PTS對(duì)各個(gè)幀進(jìn)行展現(xiàn)。
有時(shí)候PES包頭里面也會(huì)有DTS,PTS,對(duì)于PTS來(lái)說(shuō),他代表了這個(gè)PES包得payload里面的第一個(gè)完整地audio access unit或者video access unit的PTS時(shí)間(并不是每個(gè)audio/video access unit都帶有PTS/DTS,因此,你可以在PES里面指定一個(gè),作為開(kāi)始)。
PES包頭的DTS也是這個(gè)原理,只不過(guò)注意的是:對(duì)于video來(lái)說(shuō)他的DTS和PTS是可以不一樣的,因?yàn)?/span>B幀的存在使其順序可以倒置。而對(duì)于audio來(lái)說(shuō),audio沒(méi)有雙向的預(yù)測(cè),他的DTS和PTS可以看成是一個(gè)順序的,因此可一直采用一個(gè),即可只采用PTS。
總結(jié)
以上是生活随笔為你收集整理的TS流的解码过程-ES-PES-DTS-PTS-PCR的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ffmpeg优化
- 下一篇: 关于ES、PES、PS以及TS码流