日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多媒体文件格式之TS

發布時間:2024/4/11 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多媒体文件格式之TS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TS流是MPEG-2標準中定義一種用于直播的碼流結構,具有很好的容錯能力。所有跟TS相關的標準可以從ISO/IEC_13818-1中找到。
通常TS流的后綴是.ts、.mpg或者.mpeg,多數播放器直接支持這種格式的播放。

0. 學習多媒體容器格式的目的

主要是為了回答以下問題:

  • 該容器中數據是如何組織的?
  • 該容器包含哪些編碼格式的數據?這些數據是如何存儲的?
  • 該容器包含哪些元數據信息?包含哪些節目信息?
  • 對于支持多節目的容器格式,如何找到對應的音頻流、視頻流、字幕流?
  • 如何確定該容器的節目播放時長?
  • 如何從該容器中提取音頻、視頻、字幕數據,并交給解碼器解碼,有時間戳否?
  • 該容器是否支持seek?有哪些輔助信息?
  • 是否支持直接流化?
  • 哪里可以找到該容器格式最標準的文檔資料?
  • 有哪些可用的工具,方便分析容器格式異常或者錯誤?
  • 1. TS流生成和解析的過程

    TS流的形成過程:
    1、 將原始音視頻數據壓縮之后,壓縮結果組成一個基本碼流(ES)。
    2、 對ES(基本碼流)進行打包形成PES。
    3、 在PES包中加入時間戳信息(PTS/DTS)。
    4、 將PES包內容分配到一系列固定長度的傳輸包(TS Packet)中。
    5、 在傳輸包中加入定時信息(PCR)。
    6、 在傳輸包中加入節目專用信息(PSI) 。
    7、 連續輸出傳輸包形成具有恒定比特率的MPEG-TS流。

    TS流的解析過程,可以說是生成的逆過程:

  • 從復用的MPEG-TS流中解析出TS包;
  • 從TS包中獲取PAT及對應的PMT(PSI中的表格);
  • 從而獲取特定節目的音視頻PID;
  • 通過PID篩選出特定音視頻相關的TS包,并解析出PES;
  • 從PES中讀取到PTS/DTS,并從PES中解析出基本碼流ES;
  • 將ES交給解碼器,獲得壓縮前的原始音視頻數據。
  • 2. TS碼流整體結構

    MPEG-2中規定TS傳輸包的長度是固定的,長度為188字節。標準規定每個TS包只能包含一個基本流的數據,不存在跨基本流的情況。
    所有的TS包都分為包頭和凈荷部分。TS包中可以填入很多東西(填入的東西都是填入到凈荷部分),有:視頻、音頻、數據(包括PSI、SI以及其它任何形式的數據)。TS只是傳輸層的協議,所以比較多的面向錯誤處理的誤碼糾正。
    用c語言描述下MPEG-TS碼流,如下:

    MPEG_transport_stream() {do {transport_packet()} while (nextbits() == sync_byte) }

    下圖是對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分配見下表:
    PID值描述
    0PAT(Program Association Table)
    1CAT(Conditional Access Table)
    3-0xFReserved
    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負載數據的類型。其取值含義如下:

    Valuedescription
    0x00program_association_section
    0x01conditional_access_section (CA_section)
    0x02TS_program_map_section
    0x03TS_description_section
    0x04ISO_IEC_14496_scene_description_section
    0x05ISO_IEC_14496_object_descriptor_section
    0x06-0x37ITU-T Rec. H.222.0 / ISO/IEC 13818-1 reserved
    0x38-0x3FDefined in ISO/IEC 13818-6
    0x40-0xFEUser private
    0xFFforbidden

    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包的結構如下:

    PES_packet() {packet_start_code_prefix : 24stream_id : 8PES_packet_length: 16optional_pes_headerpes_packet_data }
    • 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流實現的。

    參考資料

  • ISO/IEC_13818-1
  • MPEG-2 TS碼流分析

  • ----------------------------------------------------------------------------------------------------------------------------
    本文作者:Tocy e-mail: zyvj@qq.com
    版權所有@2015-2020,請勿用于商業用途,轉載請注明原文地址。本人保留所有權利。

    總結

    以上是生活随笔為你收集整理的多媒体文件格式之TS的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。