多媒体文件格式之TS
TS流是MPEG-2標準中定義一種用于直播的碼流結構,具有很好的容錯能力。所有跟TS相關的標準可以從ISO/IEC_13818-1中找到。
通常TS流的后綴是.ts、.mpg或者.mpeg,多數播放器直接支持這種格式的播放。
0. 學習多媒體容器格式的目的
主要是為了回答以下問題:
1. TS流生成和解析的過程
TS流的形成過程:
1、 將原始音視頻數據壓縮之后,壓縮結果組成一個基本碼流(ES)。
2、 對ES(基本碼流)進行打包形成PES。
3、 在PES包中加入時間戳信息(PTS/DTS)。
4、 將PES包內容分配到一系列固定長度的傳輸包(TS Packet)中。
5、 在傳輸包中加入定時信息(PCR)。
6、 在傳輸包中加入節目專用信息(PSI) 。
7、 連續輸出傳輸包形成具有恒定比特率的MPEG-TS流。
TS流的解析過程,可以說是生成的逆過程:
2. TS碼流整體結構
MPEG-2中規定TS傳輸包的長度是固定的,長度為188字節。標準規定每個TS包只能包含一個基本流的數據,不存在跨基本流的情況。
所有的TS包都分為包頭和凈荷部分。TS包中可以填入很多東西(填入的東西都是填入到凈荷部分),有:視頻、音頻、數據(包括PSI、SI以及其它任何形式的數據)。TS只是傳輸層的協議,所以比較多的面向錯誤處理的誤碼糾正。
用c語言描述下MPEG-TS碼流,如下:
下圖是對TS碼流的一個分層結構:
TS包頭
TS包的包頭提供關于傳輸方面的信息:同步、有無差錯、有無加擾、PCR(節目參考時鐘)等標志。TS包的包頭長度不固定,前32比特(4個字節)固定,后面可能跟有自適應字段(適配域)。32個比特(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:指示存儲與分組有效負載中數據的類型。PID值0x0000—0x000F保留。其中0x0000為PAT保留;0x0001為CAT保留;0x1fff為分組保留,即空包。標準中定義的PID分配見下表:
| 0 | PAT(Program Association Table) |
| 1 | CAT(Conditional Access Table) |
| 3-0xF | Reserved |
| 0x10-0x1FFE | 自定義PID,可用于PMT的pid、network的pid或者其他目標 |
| 0x1FFF | 空包 |
| - | 注意PCR的PID可以選擇0、1或者0x10-0x1FFE的任意值。 |
- transport_scrambling_control(加擾控制標志):表示TS流分組有效負載的加密模式??瞻鼮椤?0’,如果傳輸包包頭中包括調整字段,不應被加密。其他取值含義是用戶自定義的。
- adaptation_field_control(適配域控制標志):表示包頭是否有調整字段或有效負載。‘00’為ISO/IEC未來使用保留;‘01’僅含有效載荷,無調整字段;‘10’ 無有效載荷,僅含調整字段;‘11’ 調整字段后為有效載荷,調整字段中的前一個字節表示調整字段的長度length,有效載荷開始的位置應再偏移[length]個字節??瞻鼞獮椤?0’。
- continuity_counter(連續性計數器):隨著每一個具有相同PID的TS流分組而增加,當它達到最大值后又回復到0。范圍為0~15。
關于adaption_filed字段建議參考標準文檔的ch2.4.3.4 Adaptation field一節。
TS包負載部分
TS包中凈荷所傳輸的信息包括兩種類型:
- 視頻、音頻的PES包以及輔助數據;
- 節目專用信息PSI。
當然,TS包也可以是空包??瞻脕硖畛銽S流,可能在重新進行多路復用時被插入或刪除。
在系統復用時,視頻、音頻的ES流需進行打包形成視頻、音頻的 PES流,輔助數據(如圖文電視信息)不需要打成PES包。
3. 節目專用信息PSI(Program Specific Information)
在TS流中傳輸的主要有四類表格,其中包含了解復用和顯示節目相關的信息。
節目信息的結構性的描述如下;
- 節目關聯表Program Association Table (PAT) 0x0000
- 節目映射表Program Map Tables (PMT)
- 條件接收表Conditional Access Table (CAT) 0x0001
- 網絡信息表Network Information Table(NIT) 0x0010
- 傳輸流描述表Transport Stream Description Table(TSDT) 0x02
其中PMT中定義了與特定節目相關的PID信息,比如音頻包pid、視頻包pid以及pcr的pid;CAT表格用于流加擾情況下配置參數;NIT是可選的,標準中未詳細定義;TSDT也是可選的。
這些表格信息保存到TS中,需要先切分成section,然后放到TS包中。
這里僅詳細說明PAT和PMT表的構成,其他表格建議參考標準文檔。
PAT表
TS流中會定期出現PAT表。PAT表提供了節目號和對應PMT表格的PID的對應關系。
其具體結構如下圖:
第一個字段table_id,8位,用于標識PSI section負載數據的類型。其取值含義如下:
| 0x00 | program_association_section |
| 0x01 | conditional_access_section (CA_section) |
| 0x02 | TS_program_map_section |
| 0x03 | TS_description_section |
| 0x04 | ISO_IEC_14496_scene_description_section |
| 0x05 | ISO_IEC_14496_object_descriptor_section |
| 0x06-0x37 | ITU-T Rec. H.222.0 / ISO/IEC 13818-1 reserved |
| 0x38-0x3F | Defined in ISO/IEC 13818-6 |
| 0x40-0xFE | User private |
| 0xFF | forbidden |
PAT中定義的節目號(program_number)與PMT_PID的映射。當節目號為0時,存儲的是network_PID。
詳細定義建議參考2.4.4.3 Program association Table一節。
PMT表
PMT在傳送流中用于指示組成某一套節目的視頻、音頻和數據在傳送流中的位置,即對應的TS包的PID值,以及每路節目的節目時鐘參考(PCR)字段的位置。
其結構定義如下:
其中的stream_type標識了對應pid的類型,比如音頻、視頻或者其他類型(具體建議參考2.4.4.9 Semantic definition of fields in Transport Stream program map section一節)。
4. PES包
PES包使用固定的24位起始碼0x000001和一個8為的stream-id,用于說明當前包的類型。PES包中可以包含DTS/PTS等時間戳信息。整體結構如下圖:
PES包非定長,音頻的PES包小于等于64K,視頻的一般為一幀一個PES包。一幀圖象的PES包通常要由許多個TS包來傳輸。MPEG-2中規定,一個PES包必須由整數個TS包來傳輸。如果承載一個PES包的最后一個TS包沒能裝滿,則用填充字節來填滿;當下一個新的PES包形成時,需用新的TS包來開始傳輸。
PES包的結構如下:
- packet_start_code_prefix:24位起始碼,固定必須是'0000 0000 0000 0000 0000 0001' (0x000001)。用于標識包的開始。
- stream_id:在PS流中該字段標識其存儲的基本流的類型和索引號,在TS流中該字段僅標識其存儲的基本流的類型。
- PES_packet_length:16位,用于存儲PES包的長度。
- optional_pes_header需要視stream_id類型而定,其長度不固定(這里包含DTS/PTS時間戳信息)。
- pes_packet_data其長度是PES_packet_length定義的長度值。
最后兩個字段的解析,建議參考標準文件的2.4.3.7 Semantic definition of fields in PES packet一節。
5. 其他問題
TS流是我接觸的第一個封裝格式,也是經過很長時間才完全整明白具體的解碼流程。
本文不涉及太多的細節問題。很明顯TS流中不包含快速seek的機制,只能通過協議層實現seek。
分析TS流建議使用TsAnalyse等現有的工具,在廣電普遍使用的TS流,有較多的現成工具。新出來的HLS協議也是基于TS流實現的。
參考資料
----------------------------------------------------------------------------------------------------------------------------
本文作者:Tocy e-mail: zyvj@qq.com
版權所有@2015-2020,請勿用于商業用途,轉載請注明原文地址。本人保留所有權利。
總結
以上是生活随笔為你收集整理的多媒体文件格式之TS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RTSP、RTMP和HTTP协议的区别
- 下一篇: 最简单的基于FFmpeg的AVDevic