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

1、TS 格式標準介紹

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

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

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流實現的。ui

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

2、TS 格式詳解

TS文件(流)能夠分爲三層:TS層(Transport Stream)、PES層(Packet Elemental Stream)、ES層(Elementary Stream)。code

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

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

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

3、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包。

4、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音頻。

5、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交給解碼器,得到壓縮前的原始音視頻數據。
相關文章
相關標籤/搜索