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加密
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
TS包大小固定爲188字節,TS層分爲三個部分:TS Header、Adaptation Field、Payload。
TS Header固定4個字節;Adaptation Field可能存在也可能不存在,主要做用是給不足188字節的數據作填充;Payload是PES數據。
TS包的包頭提供關於傳輸方面的信息。
TS包的包頭長度不固定,前4個字節是固定的,後面可能跟有自適應字段(適配域)。4個字節是最小包頭。
包頭的結構體字段以下:
Adaptation Field的長度要包含傳輸錯誤指示符標識的一個字節。
PCR是節目時鐘參考,PCR、DTS、PTS都是對同一個系統時鐘的採樣值,PCR是遞增的,所以能夠將其設置爲DTS值,音頻數據不須要PCR。
打包TS流時PAT和PMT表是沒有Adaptation Field的,不夠的長度直接補0xff便可。
視頻流和音頻流都須要加adaptation field,一般加在一個幀的第一個ts包和最後一個ts包裏,中間的ts包不加。
TS包中Payload所傳輸的信息包括兩種類型:視頻、音頻的PES包以及輔助數據;節目專用信息PSI。
TS包也能夠是空包。空包用來填充TS流,可能在從新進行多路複用時被插入或刪除。
視頻、音頻的ES流需進行打包造成視頻、音頻的 PES流。輔助數據(如圖文電視信息)不須要打成PES包。
PES結構如圖:
從上面的結構圖能夠看出,PES層是在每個視頻/音頻幀上加入了時間戳等信息,PES包內容不少,下面咱們說明一下最經常使用的字段:
關於時間戳PTS和DTS的說明:
有PTS和DTS兩種時間戳是B幀引發的,I幀和P幀的PTS等於DTS。若是一個視頻沒有B幀,則PTS永遠和DTS相同。
從文件中順序讀取視頻幀,取出的幀順序和DTS順序相同。DTS算法比較簡單,初始值 + 增量便可,PTS計算比較複雜,須要在DTS的基礎上加偏移量。
音頻的PES中只有PTS(同DTS),視頻的I、P幀兩種時間戳都要有,視頻B幀只要PTS(同DTS)。
ES層指的就是音視頻數據。
通常的,視頻爲H.264視頻,音頻爲AAC音頻。