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