TS文件格式詳解

首先是各種流的概念


  ES流(Elementary Stream): 也叫基本碼流,包含視頻、音頻或數據的連續碼流.

  PES流(Packet Elementary Stream): 也叫打包的基本碼流, 是將基本的碼流ES流根據需要分成長度不等的數據包, 並加上包頭就形成了打包的基本碼流PES流.

  TS流(Transport Stream): 也叫傳輸流, 是由固定長度爲188字節的包組成, 含有獨立時基的一個或多個program, 一個program又可以包含多個視頻、音頻、和文字信息的ES流; 每個ES流會有不同的PID標示. 而又爲了可以分析這些ES流, TS有一些固定的PID用來間隔發送program和ES流信息的表格: PAT和PMT表.

(在MPEG-2系統中,由視頻, 音頻的ES流和輔助數據復接生成的用於實際傳輸的標準信息流稱爲MPEG-2傳送流)

////////////////////////////////////////////////////////////////////////////////////////////////

在MPEG-II標準中,爲了將一個或更多的音頻、視頻或其他的基本數據流合成單個或多個數據流,以適應於存儲和傳送,必須對其重新進行打包編碼,在碼流中還需插入各種時間標記、系統控制等信息,最後送到信道編碼與調製器。這樣可以形成兩種數據流——傳送流(TS)和節目流(PS),分別適用於不同的應用。

傳送流(Transport Stream)簡稱TS流,它是根據ITU-T Rec.H.222.0|ISO/IEC 13818-2 和ISO/IEC 13818-3協議而定義的一種數據流,其目的是爲了在有可能發生嚴重錯誤的情況下進行一道或多道程序編碼數據的傳送和存儲。這種錯誤表現爲比特值錯誤或分組丟失。傳送流由一道或多道節目組成,每道節目由一個或多個原始流和一些其他流復合在一起,包括視頻流音頻流、節目特殊信息流(PSI)和其他數據包。其中PSI表有4種類型:節目關聯表(PAT)、節目映射表(PMT)、網絡信息表和條件訪問表。傳送流應用比較廣泛,如視音頻資料的保存、電視節目的非線性編輯系統及其網絡等。在開發機頂盒以及視頻設備時有時需要對碼流的編碼知識有比較清楚地瞭解,這樣才能在遇到問題時做出全面的 分析

TS包的長度是固定的,爲188字節。包括同步字節(sync_byte)0x47和數據包識別號PID等。PID爲13位字段,指示存儲於分組有效負載中數據的類型,PID值0x0000爲程序關聯表保留,而0x0001爲條件訪問表保留,0x1FFF爲空分組保留。從PID可以判斷其後面負載的數據類型是視頻流音頻流、PSI還是其他數據包

最近徹底研究分析了ts文件格式,這裏做下學習總結:

簡單的來說,ts文件中的信息其實就是通過負載類型字段來找,找到後把數據從負載中提取出來,ts中可以有很多媒體類型數據,比如說可以同時又音頻和視頻數據,
可是要如何區分ts文件中的數據是音頻還是視頻呢?這就需要動用ts文件中的PSI描述說明了。

PSI:

在MPEG-II中定義了節目特定信息(PSI),PSI用來描述傳送流的組成結構,在MPEG-II系統中擔任極其重要的角色,在多路複用中尤爲重要的是PAT表和PMT表。PAT表給出了一路MPEG-II碼流中有多少套節目,以及它與PMT表PID之間的對應關係;PMT表給出了一套節目的具體組成情況與其視頻、音頻等PID對應關係。PSI提供了使接收機能夠自動配置的信息,用於對複用流中的不同節目流進行解複用和解碼。PSI信息由以下幾種類型表組成:

◆ 節目關聯表(PAT Program Association Table)

     PAT表用MPEG指定的PID(00)標明,通常用PID=0表示。它的主要作用是針對複用的每一路傳輸流,提供傳輸流中包含哪些節目、節目的編號以及對應節目的節目映射表(PMT)的位置,即PMT的TS包的包標識符(PID)的值,同時還提供網絡信息表(NIT)的位置,即NIT的TS包的包標識符(PID)的值。

◆ 條件接收表(CAT Conditional Access Table)

     CAT表用MPEG指定的PID(01)標明,通常用PID=1表示。它提供了在複用流中條件接收系統的有關信息,指定CA系統與它們相應的授權管理信息(EMM))之間的聯繫,指定EMM的PID,以及相關的參數。

◆ 節目映射表(PMT Program Map Table)

     節目映射表指明該節目包含的內容,即該節目由哪些流組成,這些流的類型(音頻、視頻、數據),以及組成該節目的流的位置,即對應的TS包的PID值,每路節目的節目時鐘參考(PCR)字段的位置。

◆ 網絡信息表(NIT Nerwork Information Table)

     網絡信息表提供關於多組傳輸流和傳輸網絡相關的信息,其中包含傳輸流描述符、通道頻率、衛星發射器號碼、調製特性等信息。

◆ 傳輸流描述表(TSDT Transport Stream Description Table)

    傳輸流描述表由PID爲2的TS包傳送,提供傳輸流的一些主要參數。

◆ 專用段(private_section)

     MPEG-2還定義了一種專用段用於傳送用戶自己定義的專用數據。

◆ 描述符(Descripter)

     除了上述的表述之外,MPEG-2還定義了許多描述符,這些描述符提供關於視頻流、音頻流、語言、層次、系統時鐘、碼率等多方面的信息,在PSI的表中可以靈活的採用這些描述符進一步爲接收機提供更多的信息。

     在解碼時,接收機首先根據PID值找到PAT表,找出相應節目的PMT表的PID,再由該PID找到該PMT表,再在PMT表中找到相應的碼流,然後開始解碼。

總下簡單的說就是,解析ts的過程就是通過找到PAT表,從PAT表中找出對應存在的節目的id,按照這些id找到這些節目的PMT表,從中獲到這些節目總的相對的媒體數據id,然後通過這些id,再從ts文件中找到這些文件的es數據,來完成解碼或者別的什麼操作。
  如圖:

ts文件,將每個數據包分成188個字節來發送。ts文件格式如圖:
   
 從圖中可以看到 ts文件頭分爲包頭和負載兩部分,現在我們詳細看下包頭結構:
 
sync_btye固定爲0x47 ,說明從這個字節後的188個字節都屬於一個ts包。 比較重要的是PID這個字段,共13位,表示了這個ts包負載數據的類型,如果沒有這個信息,無法再後續尋找我們想要的數據。調整字段的作用稍後會看到。這裏先跳過介紹吧,其他的字段對於ts的學習可以先不研究,不是很重要。

    現在我們看看,PAT表的結構:
    
   
     TS的解析工作,一般都是從找PAT表開始,所以,要先找到負載中頭個字節是0x00的,就說明找到PAT表了。section_length表示從這個字段開始後有幾個字節,如果不滿188個字節,就用0xff填滿。可以發現去掉最後4位的crc校驗位從section_number之後的5個字節開始,就是這個ts文件中縮有的節目了,每兩個字節代表一個節目,從中很容易獲取到節目的ID信息。
    獲取到ID之後,就可以開始查找關於這個id的PMT表了。
    PMT:
    
      
        PMT表中 多數字段含義和PAT表類似,值得注意的是對於對應節目中的媒體數都是5個字節表示,音頻數據或視屏數據。所以,從中可以發現當前節目有多少的音視頻相關信息。從stream_type可以通過查表來得知是音頻數據還是視頻數據等信息,這個就靠大家自己在網上查閱了。

         之後就可以通過得到的elementary_pid來查找對應的音視頻信息了。從而從中獲取出es流。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章