“本文轉載自
1.[音視頻開發(fā)老馬]的多媒體文件格式(四):TS 格式
2.[fang·up·ad]的視頻封裝格式篇(TS)”
本文相關系列:
1.TS格式概述
1.1 簡介
??TS(Transport Stream,傳輸流),一種常見的視頻封裝格式,是基于MPEG-2的封裝格式(所以也叫MPEG-TS),后綴為.ts。
先簡要介紹一下什么是MPEG2-TS:
??DVD的音視頻格式為MPEG2-PS,全稱是Program Stream。而TS的全稱則是Transport Stream。MPEG2-PS主要應用于存儲的具有固定時長的節(jié)目,如DVD電影,而MPEG-TS則主要應用于實時傳送的節(jié)目,比如實時廣播的電視節(jié)目。這兩種格式的主要區(qū)別是什么呢?簡單地打個比喻說,你將DVD上的VOB文件的前面一截cut掉(或者干脆就是數(shù)據(jù)損壞),那么就會導致整個文件無法解碼了,而電視節(jié)目是你任何時候打開電視機都能解碼(收看)的。
??所以,MPEG2-TS格式的特點就是要求從視頻流的任一片段開始都是可以獨立解碼的。
??我們可以看出,TS格式是主要用于直播的碼流結構,具有很好的容錯能力。通常TS流的后綴是.ts、.mpg或者.mpeg,多數(shù)播放器直接支持這種格式的播放。TS流中不包含快速seek的機制,只能通過協(xié)議層實現(xiàn)seek。HLS協(xié)議基于TS流實現(xiàn)的。
TS格式分析工具:EasyICE2.7.0.2 官方版
1.2 TS的分層結構
??TS文件(流)可以分為三層:TS層(Transport Stream)、PES層(Packet Elemental Stream)、ES層(Elementary Stream)。
- TS層:PES層上加入了數(shù)據(jù)流識別和傳輸?shù)谋匾畔?,TS文件(碼流)由多個TS Packet組成的。
- PES層:打包的基本碼流,把基本碼流(ES)分割成段,并加上頭部信息打包而成。
- ES層:壓縮編碼后的音視頻數(shù)據(jù)?;敬a流,連續(xù)碼流。
下圖中顯示了三層之間的關系:xB表示字節(jié)數(shù)不確定,4B表示字節(jié)數(shù)為4個。
2.PSI/SI
2.1 PSI信息
??PSI是對單一TS流的描述,是TS流中的引導信息。
PSI信息由節(jié)目關聯(lián)表PAT、條件接收表CAT、節(jié)目映射表PMT和網(wǎng)絡信息表NIT組成。這些表會被插入到TS流中。PSI信息是對單一TS流的描述,它是TS流的引導信息;PSI信息指定了如何從一個攜帶多個節(jié)目的傳輸流中找到指定的節(jié)目。
下面給出的是節(jié)目引導信息(或稱節(jié)目特定信息,PSI)的四個表結構。
雖然這四個結構可以十分簡單的表,但事實上,它們被進一步劃分為各個段,并插入到TS包中。
2.2 PAT解析
這里我們注意關注五個字段:

2.3 PAT的實例分析
下面給出的就是一個TS流的PAT分析情況:

根據(jù)上表可以看出,這個TS流里共有6套節(jié)目,其映射關系PID分別為0xc9、0xcb、0xce、0xcc、0xcd和0xca。(注:0xc9=201)
- 下面給出的是PMT的簡單解析:

兩相比較,可以很清楚地知道,PAT是如何鎖定各個PMT的(每個節(jié)目都有一個自己的PMT)。
- Q1:如何找到一個特定的節(jié)目?
1.已知節(jié)目名稱(或id等信息)
??首先要從節(jié)目關聯(lián)表PAT中獲取這個節(jié)目的節(jié)目映射表PMT的PID值,再從TS流中找出與此PID值相對應的節(jié)目映射表PMT;再從PMT中獲取構成這個節(jié)目的基本碼流的PID值,從而根據(jù)該PID過濾出相應的視頻、音頻和數(shù)據(jù)等基本碼流。最后解碼恢復為原始信號。
2.4 PMT解析
??PMT是連接節(jié)目號與節(jié)目元素的橋梁。
節(jié)目映射表PMT的意義在于,它給出了節(jié)目號與組成這個節(jié)目元素之間的映射;也就是說,PMT是連接節(jié)目號(PAT指定)與節(jié)目元素(音頻和視頻)的橋梁。我們知道,一個電視節(jié)目至少包含了視頻和音頻數(shù)據(jù),而每一個節(jié)目的視音頻數(shù)據(jù)都是以包的形式在TS流中傳輸?shù)?;所以說,一個TS流包含了多個節(jié)目的視頻和音頻數(shù)據(jù)包。要想過濾出一個TS流中其中一個節(jié)目的視頻和音頻,則需要知道這個節(jié)目中視頻和音頻的標識號PID。PMT表的作用就在于,它提供了每個節(jié)目視頻、音頻(或其他)數(shù)據(jù)包的PID。
2.5 PMT的表結構分析
這里著重介紹兩個字段:
- elementary_PID:標識了該節(jié)目(program_number)攜帶的基本流的識別號PID
- stream_type:流類型,指出了PID為elementary_PID的基本流的類型
附:流類型取值說明

2.6 PMT的實例分析
下面給出了碼流分析儀分析一段TS流的PMT表:

??首先,注意到這張PMT表的progam_number=0xc9,就是我們在上面解析PAT表得到的。
從上面可以知道,節(jié)目號為0xc9(即201)的節(jié)目有兩個單元流:

elementary_PID和stream_type的意義在于,告知接收機基本流的類型和識別PID。要想獲取這個節(jié)目的視頻,只需要對PID為0x21的數(shù)據(jù)包進行過濾,并交由視頻處理模塊處理。下圖所示(除了節(jié)目名稱,還需要SDT表信息)即為PAT和PMT共同獲取的信息。

2.7 PSI小結

??上圖給出了在一個TS流中PSI各表之間的聯(lián)系。首先從PAT表出發(fā),獲取當前有哪些節(jié)目號(program_map_PID),再根據(jù)這些節(jié)目號找出program_number相同的PMT;獲取到PMT后,即可根據(jù)elementary_PID和stream_type來確定要過濾哪些含有基本流的TS包,以及這些包里面是什么類型的數(shù)據(jù)。這樣,機頂盒就可以過濾出相應的節(jié)目(視頻和音頻數(shù)據(jù))來收看了。
3.TS層
??TS傳輸流,是由固定?度的包組成,含有獨?時間基準的?個或多個節(jié)?,適?于誤碼較多的環(huán)境,并且從流的任意?段開始都可以獨?解碼。PS(Program Stream):節(jié)?流,PS流與TS流的區(qū)別在于,PS流的包結構是可變?度,?TS流的包結構是固定?度。
- ts包大小固定為188字節(jié),ts層分為三個部分:ts header、adaptation field、payload。
- ts header固定4個字節(jié);每188字節(jié)單元就有一個ts header。
- adaptation field可能存在也可能不存在,主要作用是給不足188字節(jié)的數(shù)據(jù)做填充。
- payload是 PES 數(shù)據(jù),或者PAT,PMT等。PAT、PMT是解析ts尋找音視頻流很重要的表。
- ts Header + adaptation field 格式如下:

3.1 TS Header
TS包的包頭提供關于傳輸方面的信息。其格式如下:

- PID信息非常關鍵,它直接表征本次TS包的用途。比較重要的是PAT和PMT。常用的PID值:

3.2 TS Adaptation Field
??在MPEG-2 TS中,為了傳送打包后長度不足188B的不完整TS,或者為了在系統(tǒng)層插入節(jié)目時鐘參考(program clock reference, PCR),需要在TS包中插入可變字節(jié)的調整字段。調整字段其中一個重要作用是解決編解碼器的音視頻同步問題。一般在視頻幀中的TS包的調整字段中,每隔一定傳輸時間,傳送系統(tǒng)時鐘27MHz的一個抽樣值給接收機,作為解碼器解碼時的時鐘參考信息PCR。PCR通常每隔100ms至少被傳輸一次。PCR的數(shù)值所表示的是解碼器在讀完這個抽樣值的最后那個字節(jié)時,解碼器本地時鐘所應處的狀態(tài)。通常情況下,PCR不直接改變解碼器的本地時鐘,而是作為參考基準來調整本地時鐘,使之與PCR趨于一致。
- Adaptation Field的長度要包含傳輸錯誤指示符標識的一個字節(jié)。
- PCR是節(jié)目時鐘參考,PCR、DTS、PTS都是對同一個系統(tǒng)時鐘的采樣值,PCR是遞增的,因此可以將其設置為DTS值,音頻數(shù)據(jù)不需要PCR。
- 打包TS流時PAT和PMT表是沒有Adaptation Field的,不夠的長度直接補0xff即可。
- 視頻流和音頻流都需要加adaptation field,通常加在一個幀的第一個ts包和最后一個ts包里,中間的ts包不加。

3.3 TS Payload
在介紹TS Payload之前先理解一下PSI和SI:
- PSI:Program Specific Information, 節(jié)目引導信息,在MPEG-2標準中定義的。
- SI:Service Information, 業(yè)務信息,在DVB標準中定義的。
常見的有:

??前邊提到了PAT和PMT,它們都是PSI之一(節(jié)目專用信息(Program Special Information, PSI)。MPEG-2 TS傳送的TS包攜帶兩類信息:已壓縮的音視頻(PES)和與之相關的符號化表(PSI),由傳送包PES的PID來標識。如果是PSI,那么payload內容為PAT表結構、PMT表結構;如果為音視頻,那么payload內容為PES包。
??Program Association Table,節(jié)目關聯(lián)表,是接收數(shù)據(jù)的入口點,解析TS的起點。

??如下為ts文件的PAT和PMT。PAT表指定節(jié)目列表以及節(jié)目對應的PID;PMT指定某節(jié)目的所有音視頻流及其對應的PID。由下圖右側可知,PAT指出只有一個節(jié)目0x001,且此節(jié)目對應的PMT的PID為256;PMT指出0x001節(jié)目所有視頻流PID為258,音頻PID為257;左側是ts文件的PAT PMT PID的統(tǒng)計。

(1)PAT表結構 (指明PMT表的PID值)
??節(jié)目關聯(lián)表(Program Association Table, PAT),得出所有節(jié)目的PID。N loop為一個數(shù)組,是節(jié)目列表及其對應的pid,每個節(jié)目就是指一段視頻,具有唯一id。

(2)PMT表(指明音視頻流的PID值)
??PMT提供一路節(jié)目包含的所有原始碼流的PID映射表。原始碼流的PID從ts header的pid讀取。

??程序在讀取N環(huán)的時候會讀取該節(jié)目所有的碼流列表及其PID,解析的時候可以根據(jù)PID來分離。N環(huán)描述符包括的信息如下圖所示。節(jié)目時鐘參考PCR的PID和視頻的PID是相等的。由PAT得出所有的節(jié)目列表,選定收看的節(jié)目后,篩選出等于該節(jié)目PID的TS包,就可以得到該節(jié)目的所有碼流的PID映射表,這樣接收機就可以只接收PID等于該節(jié)目的碼流的TS包即可收看該節(jié)目。

(3)補充說明
- 打包ts流時PAT和PMT表是沒有調整字段的,不夠的長度直接補0xFF即可。
- 視頻流和音頻流都需要加adaptation field,通常加在一個幀的第一個ts包和最后一個ts包里,中間的ts包不加。
4.PES 層
??分組的原始碼流,將原始碼流ES流根據(jù)需要,分成?度不等的數(shù)據(jù)包,并加上包頭就形成了打包的基本碼流PES流。是?來傳輸ES的?種數(shù)據(jù)結構。
- PES(Packetized Elementary Stream,打包的ES),在 ES 層的基礎上加入了時間戳(PTS/TDS)等信息。
- ES數(shù)據(jù)包比較大,加入PES頭時需將ES進行分割,只在第一個分割的ES上加PES頭,如下圖所示:

- PES packet length — 指示PES 包中跟隨該字段最后字節(jié)的字節(jié)數(shù)。0 值指示PES 包長度既未指示也未限定并且僅在這樣的PES 包中才被允許,該PES 包的有效載荷由來自傳輸流包中所包含的視頻基本流的字節(jié)組成。
- PES結構如下:

- PES 關鍵字段說明
??PES包的第5個字節(jié)標識一整個PES包的長度,一般來說,一個PES包包含一幀圖像,獲取了PES的包長度Len,當接收到Len個字節(jié)后,將接收到的字節(jié)組成一個block,放入FIFO中,等待解碼線程解碼。DTS和PTS也在PES包中傳送。

5.ES層
- ES(Elementary Stream,基本碼流),就是不分組的?頻、視頻或其他信息的連續(xù)碼流,比如視頻H.264,音頻AAC。
- 一個 ES 流中只包含一種類型的數(shù)據(jù)(視頻,或音頻,或字幕)。
6.TS流生成及解析流程
6.1 TS 流生成流程
將原始音視頻數(shù)據(jù)壓縮之后,壓縮結果組成一個基本碼流(ES)。
對ES(基本碼流)進行打包形成PES。
在PES包中加入時間戳信息(PTS/DTS)。
將PES包內容分配到一系列固定長度的傳輸包(TS Packet)中。
在傳輸包中加入定時信息(PCR)。
在傳輸包中加入節(jié)目專用信息(PSI) 。
連續(xù)輸出傳輸包形成具有恒定比特率的MPEG-TS流。
6.2 TS 流解析流程
復用的MPEG-TS流中解析出TS包;
從TS包中獲取PAT及對應的PMT;
從而獲取特定節(jié)目的音視頻PID;
通過PID篩選出特定音視頻相關的TS包,并解析出PES;
從PES中讀取到PTS/DTS,并從PES中解析出基本碼流ES;
將ES交給解碼器,獲得壓縮前的原始音視頻數(shù)據(jù)。
7.TS視頻流分析
(1)使用EasyICE打開ts文件
??可以看到ts文件的十六進制流。然后換算成二進制對比協(xié)議即可得出數(shù)據(jù)含義。FF是填充為,因為不滿180字節(jié),所以填充。每行為一個ts單元包,都包括ts、adaption field、payload。

(2)對照協(xié)議
??左邊為協(xié)議解釋,右邊淺藍低為抓包到的十六進制數(shù)據(jù)。十六進制轉換為二進制時需要一位一位轉化,不能夠兩位十六進制轉化。
