TS流的解碼過程

轉自:http://blog.csdn.net/godspirits/article/details/5653381 以備忘


TS 流解碼過程:

1. 獲取TS中的PAT

2. 獲取TS中的PMT

3. 根據PMT可以知道當前網絡中傳輸的視頻(音頻)類型(H264),相應的PID,PCR的PID等信息。

4. 設置demux 模塊的視頻Filter 爲相應視頻的PID和stream type等。

5. 從視頻Demux Filter 後得到的TS數據包中的payload 數據就是 one piece of PES,在TS header中有一些關於此 payload屬於哪個 PES的 第多少個數據包。 因此軟件中應該將此payload中的數據copy到PES的buffer中,用於拼接一個PES包。

6. 拼接好的PES包的包頭會有 PTS,DTS信息,去掉PES的header就是 ES。

7. 直接將 被拔掉 PES包頭的ES包送給decoder就可以進行解碼。解碼出來的數據就是一幀一幀的視頻數據,這些數據至少應當與PES中的PTS關聯一下,以便進行視音頻同步。

8. I,B,B,P 信息是在ES中的。

 

ES是直接從編碼器出來的數據流,可以是編碼過的視頻數據流,音頻數據流,或其他編碼數據流的統稱。ES流經過PES打包器之後,被轉換成PES包。PES包由包頭和payload組成.


在PES層,主要是在PES包頭信息中加入PTS(顯示時間標籤)和DTS(解碼時間標籤)用於視頻、音頻同步。其實,Mpeg-2用於視音頻同步以及系統時鐘恢復的時間標籤分別在ES,PES和TS這3個層次中。在ES層,與同步有關的主要是視頻緩衝驗證VBV(Video Buffer Verifier),用以防止解碼器的緩衝器出現上溢或下溢;在PES層,主要是在PES頭信息裏出現的顯示時間標籤PTS(Presentation Time Stamp)和解碼時間標籤DTS(Decoding Time Stamp);在TS層中,TS頭信息包含了節目時鐘參考PCR(Program Clock Reference),用於恢復出與編碼端一致的系統時序時鐘STC(System Time Clock)。

基本流程如下:首先MPEG-2壓縮編碼得到的ES基本流,這個數據流很大,並且只是I,P,B的這些視頻幀或音頻取樣信息,然後加入一些同步信息,打包成長度可變長度的數據包PES,原來是流的格式,現在成了數據包的分割形式。同時要注意的是,ES是隻包含一種內容的數據流,如只含視頻,或只含音頻等,打包之後的PES也是隻含一種性質的ES,如只含視頻ES的PES,只含音頻ES的PES等。可以知道,ES是編碼視頻數據流或音頻數據流,每個ES都由若干個存取單元(AU)組成,每個視頻AU或音頻AU都是由頭部和編碼數據兩部分組成,1個AU相當於編碼的1幅視頻圖像或1個音頻幀,也可以說,每個AU實際上是編碼數據流的顯示單元,即相當於解碼的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幀,由於經過複用後數據包的順序會發生變化,顯示前一定要存儲於視頻解碼器的從新排序緩存器中,經過從新排序後再顯示,所以一定要同時插入PTS和 DTS作爲從新排序的依據。

 

其中,有否PTS/DTS標誌,是解決視音頻同步顯示、防止解碼器輸入緩存器上溢或下溢的關鍵所在。PTS表明顯示單元出現在系統目標解碼器(STD- System Target Decoder)的時間, DTS表明將存取單元全部字節從STD的ES解碼緩存器移走的時刻。視頻編碼圖像幀次序爲 I1,P4,B2,B3,P7,B5,B6,I10,B8,B9的ES,加入PTS/DTS後,打包成一個個視頻PES包。每個PES包都有一個包頭,用於定義PES內的數據內容,提供定時資料。每個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要在提前插入數據流中的時間標誌指引下,經過緩存器重新排序,以重建編碼前視頻幀次序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對各個幀進行展現。

有時候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。


發佈了16 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章