多媒體檔案格式(四):TS 格式
一、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的說明:
- PTS是顯示時間戳、DTS是解碼時間戳。
- 視訊資料兩種時間戳都需要,音訊資料的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交給解碼器,獲得壓縮前的原始音視訊資料。