“本文轉(zhuǎn)載自
1.[音視頻開發(fā)老馬]的多媒體文件格式(四):TS 格式
2.[fang·up·ad]的視頻封裝格式篇(TS)”
本文相關(guān)系列:
1.TS格式概述
1.1 簡介
??TS(Transport Stream,傳輸流),一種常見的視頻封裝格式插勤,是基于MPEG-2的封裝格式(所以也叫MPEG-TS)灾茁,后綴為.ts。
先簡要介紹一下什么是MPEG2-TS:
??DVD的音視頻格式為MPEG2-PS,全稱是Program Stream。而TS的全稱則是Transport Stream。MPEG2-PS主要應(yīng)用于存儲的具有固定時長的節(jié)目第租,如DVD電影,而MPEG-TS則主要應(yīng)用于實時傳送的節(jié)目我纪,比如實時廣播的電視節(jié)目慎宾。這兩種格式的主要區(qū)別是什么呢丐吓?簡單地打個比喻說,你將DVD上的VOB文件的前面一截cut掉(或者干脆就是數(shù)據(jù)損壞)趟据,那么就會導(dǎo)致整個文件無法解碼了券犁,而電視節(jié)目是你任何時候打開電視機都能解碼(收看)的。
??所以汹碱,MPEG2-TS格式的特點就是要求從視頻流的任一片段開始都是可以獨立解碼的粘衬。
??我們可以看出,TS格式是主要用于直播的碼流結(jié)構(gòu)咳促,具有很好的容錯能力稚新。通常TS流的后綴是.ts、.mpg或者.mpeg跪腹,多數(shù)播放器直接支持這種格式的播放褂删。TS流中不包含快速seek的機制,只能通過協(xié)議層實現(xiàn)seek冲茸。HLS協(xié)議基于TS流實現(xiàn)的笤妙。
TS格式分析工具:EasyICE2.7.0.2 官方版
1.2 TS的分層結(jié)構(gòu)
??TS文件(流)可以分為三層:TS層(Transport Stream)、PES層(Packet Elemental Stream)噪裕、ES層(Elementary Stream)。
- TS層:PES層上加入了數(shù)據(jù)流識別和傳輸?shù)谋匾畔⒐珊粒琓S文件(碼流)由多個TS Packet組成的膳音。
- PES層:打包的基本碼流,把基本碼流(ES)分割成段铃诬,并加上頭部信息打包而成祭陷。
- ES層:壓縮編碼后的音視頻數(shù)據(jù)∪は基本碼流兵志,連續(xù)碼流。
下圖中顯示了三層之間的關(guān)系:xB表示字節(jié)數(shù)不確定宣肚,4B表示字節(jié)數(shù)為4個想罕。
2.PSI/SI
2.1 PSI信息
??PSI是對單一TS流的描述,是TS流中的引導(dǎo)信息霉涨。
PSI信息由節(jié)目關(guān)聯(lián)表PAT按价、條件接收表CAT、節(jié)目映射表PMT和網(wǎng)絡(luò)信息表NIT組成笙瑟。這些表會被插入到TS流中楼镐。PSI信息是對單一TS流的描述,它是TS流的引導(dǎo)信息往枷;PSI信息指定了如何從一個攜帶多個節(jié)目的傳輸流中找到指定的節(jié)目框产。
下面給出的是節(jié)目引導(dǎo)信息(或稱節(jié)目特定信息凄杯,PSI)的四個表結(jié)構(gòu)。
雖然這四個結(jié)構(gòu)可以十分簡單的表秉宿,但事實上戒突,它們被進(jìn)一步劃分為各個段,并插入到TS包中蘸鲸。
2.2 PAT解析
這里我們注意關(guān)注五個字段:
2.3 PAT的實例分析
下面給出的就是一個TS流的PAT分析情況:
根據(jù)上表可以看出妖谴,這個TS流里共有6套節(jié)目,其映射關(guān)系PID分別為0xc9酌摇、0xcb膝舅、0xce、0xcc窑多、0xcd和0xca仍稀。(注:0xc9=201)
- 下面給出的是PMT的簡單解析:
兩相比較,可以很清楚地知道埂息,PAT是如何鎖定各個PMT的(每個節(jié)目都有一個自己的PMT)技潘。
- Q1:如何找到一個特定的節(jié)目?
1.已知節(jié)目名稱(或id等信息)
??首先要從節(jié)目關(guān)聯(lián)表PAT中獲取這個節(jié)目的節(jié)目映射表PMT的PID值千康,再從TS流中找出與此PID值相對應(yīng)的節(jié)目映射表PMT享幽;再從PMT中獲取構(gòu)成這個節(jié)目的基本碼流的PID值,從而根據(jù)該PID過濾出相應(yīng)的視頻拾弃、音頻和數(shù)據(jù)等基本碼流值桩。最后解碼恢復(fù)為原始信號。
2.4 PMT解析
??PMT是連接節(jié)目號與節(jié)目元素的橋梁豪椿。
節(jié)目映射表PMT的意義在于奔坟,它給出了節(jié)目號與組成這個節(jié)目元素之間的映射;也就是說搭盾,PMT是連接節(jié)目號(PAT指定)與節(jié)目元素(音頻和視頻)的橋梁咳秉。我們知道,一個電視節(jié)目至少包含了視頻和音頻數(shù)據(jù)鸯隅,而每一個節(jié)目的視音頻數(shù)據(jù)都是以包的形式在TS流中傳輸?shù)睦浇ǎ凰哉f,一個TS流包含了多個節(jié)目的視頻和音頻數(shù)據(jù)包蝌以。要想過濾出一個TS流中其中一個節(jié)目的視頻和音頻霎奢,則需要知道這個節(jié)目中視頻和音頻的標(biāo)識號PID。PMT表的作用就在于饼灿,它提供了每個節(jié)目視頻幕侠、音頻(或其他)數(shù)據(jù)包的PID。
2.5 PMT的表結(jié)構(gòu)分析
這里著重介紹兩個字段:
- elementary_PID:標(biāo)識了該節(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ù)包進(jìn)行過濾占拍,并交由視頻處理模塊處理。下圖所示(除了節(jié)目名稱捎迫,還需要SDT表信息)即為PAT和PMT共同獲取的信息晃酒。
2.7 PSI小結(jié)
??上圖給出了在一個TS流中PSI各表之間的聯(lián)系。首先從PAT表出發(fā)窄绒,獲取當(dāng)前有哪些節(jié)目號(program_map_PID)贝次,再根據(jù)這些節(jié)目號找出program_number相同的PMT;獲取到PMT后彰导,即可根據(jù)elementary_PID和stream_type來確定要過濾哪些含有基本流的TS包蛔翅,以及這些包里面是什么類型的數(shù)據(jù)。這樣位谋,機頂盒就可以過濾出相應(yīng)的節(jié)目(視頻和音頻數(shù)據(jù))來收看了山析。
3.TS層
??TS傳輸流,是由固定?度的包組成掏父,含有獨?時間基準(zhǔn)的?個或多個節(jié)?盖腿,適?于誤碼較多的環(huán)境,并且從流的任意?段開始都可以獨?解碼损同。PS(Program Stream):節(jié)?流,PS流與TS流的區(qū)別在于鸟款,PS流的包結(jié)構(gòu)是可變?度膏燃,?TS流的包結(jié)構(gòu)是固定?度。
- 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包的包頭提供關(guān)于傳輸方面的信息方椎。其格式如下:
- PID信息非常關(guān)鍵聂抢,它直接表征本次TS包的用途。比較重要的是PAT和PMT棠众。常用的PID值:
3.2 TS Adaptation Field
??在MPEG-2 TS中琳疏,為了傳送打包后長度不足188B的不完整TS,或者為了在系統(tǒng)層插入節(jié)目時鐘參考(program clock reference闸拿, PCR)空盼,需要在TS包中插入可變字節(jié)的調(diào)整字段。調(diào)整字段其中一個重要作用是解決編解碼器的音視頻同步問題胸墙。一般在視頻幀中的TS包的調(diào)整字段中我注,每隔一定傳輸時間,傳送系統(tǒng)時鐘27MHz的一個抽樣值給接收機迟隅,作為解碼器解碼時的時鐘參考信息PCR但骨。PCR通常每隔100ms至少被傳輸一次。PCR的數(shù)值所表示的是解碼器在讀完這個抽樣值的最后那個字節(jié)時智袭,解碼器本地時鐘所應(yīng)處的狀態(tài)奔缠。通常情況下,PCR不直接改變解碼器的本地時鐘吼野,而是作為參考基準(zhǔn)來調(diào)整本地時鐘校哎,使之與PCR趨于一致。
- Adaptation Field的長度要包含傳輸錯誤指示符標(biāo)識的一個字節(jié)瞳步。
- PCR是節(jié)目時鐘參考闷哆,PCR、DTS单起、PTS都是對同一個系統(tǒng)時鐘的采樣值抱怔,PCR是遞增的,因此可以將其設(shè)置為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é)目引導(dǎo)信息勇蝙,在MPEG-2標(biāo)準(zhǔn)中定義的。
- SI:Service Information, 業(yè)務(wù)信息挨约,在DVB標(biāo)準(zhǔn)中定義的浅蚪。
常見的有:
??前邊提到了PAT和PMT藕帜,它們都是PSI之一(節(jié)目專用信息(Program Special Information, PSI)惜傲。MPEG-2 TS傳送的TS包攜帶兩類信息:已壓縮的音視頻(PES)和與之相關(guān)的符號化表(PSI)洽故,由傳送包PES的PID來標(biāo)識。如果是PSI盗誊,那么payload內(nèi)容為PAT表結(jié)構(gòu)时甚、PMT表結(jié)構(gòu);如果為音視頻哈踱,那么payload內(nèi)容為PES包荒适。
??Program Association Table,節(jié)目關(guān)聯(lián)表开镣,是接收數(shù)據(jù)的入口點刀诬,解析TS的起點。
??如下為ts文件的PAT和PMT邪财。PAT表指定節(jié)目列表以及節(jié)目對應(yīng)的PID陕壹;PMT指定某節(jié)目的所有音視頻流及其對應(yīng)的PID。由下圖右側(cè)可知树埠,PAT指出只有一個節(jié)目0x001糠馆,且此節(jié)目對應(yīng)的PMT的PID為256;PMT指出0x001節(jié)目所有視頻流PID為258怎憋,音頻PID為257又碌;左側(cè)是ts文件的PAT PMT PID的統(tǒng)計。
(1)PAT表結(jié)構(gòu) (指明PMT表的PID值)
??節(jié)目關(guān)聯(lián)表(Program Association Table绊袋, PAT)毕匀,得出所有節(jié)目的PID。N loop為一個數(shù)組癌别,是節(jié)目列表及其對應(yīng)的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表是沒有調(diào)整字段的穗熬,不夠的長度直接補0xFF即可镀迂。
- 視頻流和音頻流都需要加adaptation field,通常加在一個幀的第一個ts包和最后一個ts包里唤蔗,中間的ts包不加探遵。
4.PES 層
??分組的原始碼流,將原始碼流ES流根據(jù)需要妓柜,分成?度不等的數(shù)據(jù)包箱季,并加上包頭就形成了打包的基本碼流PES流。是?來傳輸ES的?種數(shù)據(jù)結(jié)構(gòu)棍掐。
- PES(Packetized Elementary Stream藏雏,打包的ES),在 ES 層的基礎(chǔ)上加入了時間戳(PTS/TDS)等信息作煌。
- ES數(shù)據(jù)包比較大掘殴,加入PES頭時需將ES進(jìn)行分割,只在第一個分割的ES上加PES頭最疆,如下圖所示:
- PES packet length — 指示PES 包中跟隨該字段最后字節(jié)的字節(jié)數(shù)杯巨。0 值指示PES 包長度既未指示也未限定并且僅在這樣的PES 包中才被允許,該PES 包的有效載荷由來自傳輸流包中所包含的視頻基本流的字節(jié)組成努酸。
- PES結(jié)構(gòu)如下:
- PES 關(guān)鍵字段說明
??PES包的第5個字節(jié)標(biāo)識一整個PES包的長度服爷,一般來說,一個PES包包含一幀圖像仍源,獲取了PES的包長度Len,當(dāng)接收到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ù)壓縮之后操灿,壓縮結(jié)果組成一個基本碼流(ES)锯仪。
對ES(基本碼流)進(jìn)行打包形成PES。
在PES包中加入時間戳信息(PTS/DTS)趾盐。
將PES包內(nèi)容分配到一系列固定長度的傳輸包(TS Packet)中庶喜。
在傳輸包中加入定時信息(PCR)。
在傳輸包中加入節(jié)目專用信息(PSI) 救鲤。
連續(xù)輸出傳輸包形成具有恒定比特率的MPEG-TS流久窟。
6.2 TS 流解析流程
復(fù)用的MPEG-TS流中解析出TS包;
從TS包中獲取PAT及對應(yīng)的PMT本缠;
從而獲取特定節(jié)目的音視頻PID斥扛;
通過PID篩選出特定音視頻相關(guān)的TS包,并解析出PES丹锹;
從PES中讀取到PTS/DTS稀颁,并從PES中解析出基本碼流ES;
將ES交給解碼器楣黍,獲得壓縮前的原始音視頻數(shù)據(jù)匾灶。
7.TS視頻流分析
(1)使用EasyICE打開ts文件
??可以看到ts文件的十六進(jìn)制流。然后換算成二進(jìn)制對比協(xié)議即可得出數(shù)據(jù)含義锡凝。FF是填充為粘昨,因為不滿180字節(jié)垢啼,所以填充窜锯。每行為一個ts單元包张肾,都包括ts、adaption field锚扎、payload吞瞪。
(2)對照協(xié)議
??左邊為協(xié)議解釋,右邊淺藍(lán)低為抓包到的十六進(jìn)制數(shù)據(jù)驾孔。十六進(jìn)制轉(zhuǎn)換為二進(jìn)制時需要一位一位轉(zhuǎn)化芍秆,不能夠兩位十六進(jìn)制轉(zhuǎn)化。