H264 TS流的解碼過程-ES-PES-DTS-PTS-PCR
PES流(Packet Elementary Stream): 也叫打包的基本碼流, 是將基本的碼流ES流根據需要分成長度不等的資料包, 並加上包頭就形成了打包的基本碼流PES流.
TS流(Transport Stream): 也叫傳輸流, 是由固定長度為188位元組的包組成, 含有獨立時基的一個或多個program, 一個program又可以包含多個視訊、音訊、和文字資訊的ES流; 每個ES流會有不同的PID標示. 而又為了可以分析這些ES流, TS有一些固定的PID用來間隔傳送program和ES流資訊的表格: PAT和PMT表.
(在MPEG-2系統中,由視訊, 音訊的ES流和輔助資料復接生成的用於實際傳輸的標準資訊流稱為MPEG-2傳送流)
封裝 : 就是捆綁打包, 將畫面視訊檔案和音軌檔案打包在一起, 並按照一定規則建立排序和索引, 便於播放器或播放軟體來索引播放. 包括AVI / PS(Program Stream)/ TS(Transport Stream)/ MKV(Matroska)等.
PS是節目流編碼器出來的是TS流,傳輸介面為asi口,編碼器整個作用過程是把模擬訊號變成ES,再打包成PES,再打包成TS流輸出。
複用器是把多路單節目或多節目TS流合稱1路多節目TS流,再給調製器。
數字衛星接收機出來的是TS流,也是asi介面,可能包含一路或多路節目,有的還同時有一路模擬訊號視音訊輸出。
模擬衛星接收機出來的是模擬視音訊訊號。,PS流與TS流的區別在於,PS流的包結構是可變長度的,而TS流的包結構是固定長度的.
TS流的解碼過程-ES-PES-DTS-PTS-PCR
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。