1. 程式人生 > >多媒體文件格式(四):TS 格式

多媒體文件格式(四):TS 格式

code 不可 復雜 應用 element 模式 只需要 結構圖 音頻

一、TS 格式標準介紹

TS是一種音視頻封裝格式,全稱為MPEG2-TS。其中TS即"Transport Stream"的縮寫。

先簡要介紹一下什麽是MPEG2-TS:

DVD的音視頻格式為MPEG2-PS,全稱是Program Stream。而TS的全稱則是Transport Stream。MPEG2-PS主要應用於存儲的具有固定時長的節目,如DVD電影,而MPEG-TS則主要應用於實時傳送的節目,比如實時廣播的電視節目。這兩種格式的主要區別是什麽呢?簡單地打個比喻說,你將DVD上的VOB文件的前面一截cut掉(或者幹脆就是數據損壞),那麽就會導致整個文件無法解碼了,而電視節目是你任何時候打開電視機都能解碼(收看)的。

所以,MPEG2-TS格式的特點就是要求從視頻流的任一片段開始都是可以獨立解碼的。

我們可以看出,TS格式是主要用於直播的碼流結構,具有很好的容錯能力。通常TS流的後綴是.ts、.mpg或者.mpeg,多數播放器直接支持這種格式的播放。TS流中不包含快速seek的機制,只能通過協議層實現seek。HLS協議基於TS流實現的。

TS格式分析工具:https://pan.baidu.com/s/1wh1Ajxwv8T0vHwAYjI6PJA

二、TS 格式詳解

TS文件(流)可以分為三層:TS層(Transport Stream)、PES層(Packet Elemental Stream)、ES層(Elementary Stream)。

ES層就是音視頻數據,PES層是在音視頻數據上加了時間戳等對數據幀的說明信息,TS層是在PES層上加入了數據流識別和傳輸的必要信息。TS文件(碼流)由多個TS Packet組成的。

下圖是TS文件(碼流)的分層結構圖:

技術分享圖片

原圖可以在:https://github.com/renhui/Thinking-in-AV/blob/master/多媒體格式/TS/1.TS分層結構.jpg 查看。

三、TS層

TS包大小固定為188字節,TS層分為三個部分:TS Header、Adaptation Field、Payload。

TS Header固定4個字節;Adaptation Field可能存在也可能不存在,主要作用是給不足188字節的數據做填充;Payload是PES數據。

1. TS Header

TS包的包頭提供關於傳輸方面的信息。

TS包的包頭長度不固定,前4個字節是固定的,後面可能跟有自適應字段(適配域)。4個字節是最小包頭。

包頭的結構體字段如下:

  • sync_byte(同步字節):固定為0x47;該字節由解碼器識別,使包頭和有效負載可相互分離。
  • transport_error_indicator(傳輸錯誤標誌):‘1’表示在相關的傳輸包中至少有一個不可糾正的錯誤位。當被置1後,在錯誤被糾正之前不能重置為0。
  • payload_unit_start_indicator(負載起始標誌):為1時,表示當前TS包的有效載荷中包含PES或者PSI的起始位置;在前4個字節之後會有一個調整字節,其的數值為後面調整字段的長度length。因此有效載荷開始的位置應再偏移1+[length]個字節。
  • transport_priority(傳輸優先級標誌):‘1’表明當前TS包的優先級比其他具有相同PID, 但此位沒有被置‘1’的TS包高。
  • PID:指示存儲與分組有效負載中數據的類型。
  • transport_scrambling_control(加擾控制標誌):表示TS流分組有效負載的加密模式。空包為‘00’,如果傳輸包包頭中包括調整字段,不應被加密。其他取值含義是用戶自定義的。
  • adaptation_field_control(適配域控制標誌):表示包頭是否有調整字段或有效負載。‘00’為ISO/IEC未來使用保留;‘01’僅含有效載荷,無調整字段;‘10’ 無有效載荷,僅含調整字段;‘11’ 調整字段後為有效載荷,調整字段中的前一個字節表示調整字段的長度length,有效載荷開始的位置應再偏移[length]個字節。空包應為‘10’。
  • continuity_counter(連續性計數器):隨著每一個具有相同PID的TS流分組而增加,當它達到最大值後又回復到0。範圍為0~15。

2. TS Adaptation Field

Adaptation Field的長度要包含傳輸錯誤指示符標識的一個字節。

PCR是節目時鐘參考,PCR、DTS、PTS都是對同一個系統時鐘的采樣值,PCR是遞增的,因此可以將其設置為DTS值,音頻數據不需要PCR。

打包TS流時PAT和PMT表是沒有Adaptation Field的,不夠的長度直接補0xff即可。

視頻流和音頻流都需要加adaptation field,通常加在一個幀的第一個ts包和最後一個ts包裏,中間的ts包不加。

3. TS Payload

TS包中Payload所傳輸的信息包括兩種類型:視頻、音頻的PES包以及輔助數據;節目專用信息PSI。

TS包也可以是空包。空包用來填充TS流,可能在重新進行多路復用時被插入或刪除。

視頻、音頻的ES流需進行打包形成視頻、音頻的 PES流。輔助數據(如圖文電視信息)不需要打成PES包。

四、PES層 & ES 層

1. PES層

PES結構如圖:

技術分享圖片

從上面的結構圖可以看出,PES層是在每一個視頻/音頻幀上加入了時間戳等信息,PES包內容很多,下面我們說明一下最常用的字段:

  • pes start code:開始碼,固定為0x000001。
  • stream id:音頻取值(0xc0-0xdf),通常為0xc0;視頻取值(0xe0-0xef),通常為0xe0。
  • pes packet length:後面pes數據的長度,0表示長度不限制,只有視頻數據長度會超過0xffff。
  • pes data length:後面數據的長度,取值5或10。
  • pts:33bit值
  • dts:33bit值

關於時間戳PTS和DTS的說明:

  1. PTS是顯示時間戳、DTS是解碼時間戳。
  2. 視頻數據兩種時間戳都需要,音頻數據的PTS和DTS相同,所以只需要PTS。

有PTS和DTS兩種時間戳是B幀引起的,I幀和P幀的PTS等於DTS。如果一個視頻沒有B幀,則PTS永遠和DTS相同。

從文件中順序讀取視頻幀,取出的幀順序和DTS順序相同。DTS算法比較簡單,初始值 + 增量即可,PTS計算比較復雜,需要在DTS的基礎上加偏移量。

音頻的PES中只有PTS(同DTS),視頻的I、P幀兩種時間戳都要有,視頻B幀只要PTS(同DTS)。

2. ES 層

ES層指的就是音視頻數據。

一般的,視頻為H.264視頻,音頻為AAC音頻。

五、TS流生成及解析流程

1. TS 流生成流程

  • 將原始音視頻數據壓縮之後,壓縮結果組成一個基本碼流(ES)。
  • 對ES(基本碼流)進行打包形成PES。
  • 在PES包中加入時間戳信息(PTS/DTS)。
  • 將PES包內容分配到一系列固定長度的傳輸包(TS Packet)中。
  • 在傳輸包中加入定時信息(PCR)。
  • 在傳輸包中加入節目專用信息(PSI) 。
  • 連續輸出傳輸包形成具有恒定比特率的MPEG-TS流。

2. TS 流解析流程

  • 復用的MPEG-TS流中解析出TS包;
  • 從TS包中獲取PAT及對應的PMT;
  • 從而獲取特定節目的音視頻PID;
  • 通過PID篩選出特定音視頻相關的TS包,並解析出PES;
  • 從PES中讀取到PTS/DTS,並從PES中解析出基本碼流ES;
  • 將ES交給解碼器,獲得壓縮前的原始音視頻數據。

多媒體文件格式(四):TS 格式