天天看點

TS流解析

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/videoaccess unit 都帶有 PTS/DTS ,是以,你可以在 PES 裡面指定一個,作為開始)。

PES 標頭的 DTS 也是這個原理,需要注意的是:對于 video 來說他的 DTS 和 PTS 是可以不一樣的,因為 B 幀的存在使其順序可以倒置。而對于 audio 來說, audio 沒有雙向的預測,他的 DTS 和 PTS 可以看成是一個順序的,是以可一直采用一個,即可隻采用 PTS。