TS碼流解析(3)PSI/SI解析

來源:互聯網
上載者:User
3. PSI/SI表

PSI/SI表的構成是:一個表由一個或多個子表構成,表用table_id來標識;不同的子表由table_id和table_id_extension來區分(具有相同的table_id和不同的table_id_extension);一個子表由一個或多個段構成(具有相同的table_id和table_id_extension,不同section_number來區分);每個段由多個TS資料包的資料群組成。每個段具有一個完整的資料結構,表的重要參數----描述符在段裡傳送。 3.1 PSI

PSI:(ProgramSpecial Information)節目專用資訊表。

 

PSI資訊由節目關聯表PAT、條件接收表CAT、節目映射表PMT組成。PSI資訊用來描述TS的組成結構;PSI提供了在傳送流包中傳送節目的初始化資訊,資訊指定了如何從一個攜帶多個節目的傳輸串流中找到指定的節目。

表名

標準

PID

Table_id

詳情

PAT(節目關聯表)

MPEG-2

0x0000

0x00

定義了TS中的所有節目,是PSI資訊的根節點,含有所有節目對應的PMT的PID

PMT(節目映射表)

MPEG-2

從PAT擷取

0x02

提供節目號碼與組成它們的原始碼流之間的映射,完整地描述了一路節目是由哪些PES組成的,以及它們的PID

CAT(條件接收表)

MPEG-2

0x0001

0x01

提供了一個或者多個CA系統及其授權資訊,如果對清流進行了加擾處理,那麼就必須有CAT表,其包含加擾系統的細節;條件訪問管理與授權資訊的傳送包的PID值


3.2 SI

SI:Service Information.商務資訊表

 

SI資訊內容是按照network(網路)→transport strem(傳輸串流)→service(業務)→event(事件)的分層順序描述。SI資料資訊是按照一定的資料結構進行儲存的。SI資料主要有:網路資訊、傳輸串流資訊、商務資訊、業務的事件資訊等,並且大量的資訊都是通過描述符來傳輸的。

為了能在一個TS流中提取出各種各樣的資訊,PSI/SI表裡面使用了很多的標識。

Network_id、Original_network_id、Transport_stream_id、Service id、event_id、Bouquet_id

Network_id可以定位一個網路

Network_id、Original_network_id、Transport_stream_id可以定位一個TS流,該流來源於哪個原始網路,目前在哪個網路裡播放

Network_id、Original_network_id、Transport_stream_id、Service id可以定位一個節目,這個就是SDT表的內容

Network_id、Original_network_id、Transport_stream_id、Service id、event_id可以定位節目裡面的某一個Event,這就是EIT表

Network_id、Original_network_id、Transport_stream_id、Bouquet_id可以低位一個BAT分組,分組下面有service_id可以定位分組裡所有節目


表名

PID

Table_id

詳情

NIT(網路資訊表)

預設0x0010

一般從PAT表擷取

當前網路:0x40

其他網路:0x41

傳遞了與通過一個給定的網路傳輸的TS流的物理結構相關的 資訊,以及與網路自身特性相關的資訊。

SDT(業務描述表)

0x11

現行TS:0x42

其他TS:0x46

描述包含於一個特定的傳輸串流中的業務。該業務可能是現行傳輸串流中的一部分,也可能是其他傳輸串流中的一部分,可以根據table_id 來確定。

BAT(業務分組表)

0x11

0x4A

提供有關業務群的資訊。業務群定義為一組業務的集合,並可能橫跨於不同的網路上。

EIT(節目段資訊表)

0x12

當前TS:PF 0x4E

Schedule: 0x50-0x5F

其他TS:PF 0x4F

Schedule: 0x60-0x6F

事件資訊表EIT按時間順序提供每一個業務所包含的事件的資訊。按照不同table_id,有四類EIT:當前TS的PF資訊和Schedule資訊,其他TS的PF資訊和Sechedule資訊。


3.3表的解析

組完Section之後,應該按照PID和Table_Id將Section過濾到對應的表的解析模組處進行解析,section_length等只需解析時使用的變數可以定義成局部變數不儲存,其他的必要資訊可以定義在結構體裡,解析時進行儲存。

         解析表的時候,只要根據表的結構將資料一一解析出來就可以了,一般請求的資料會使用char指標或者數組儲存,解析的時候可以用char *pdata指標來讀取資料,每次讀取足夠的位元組數後,就將pdata+= 上次讀取的位元組數,這樣不用去即時地計算資料讀取到了哪個位置,編寫代碼更加高效。需要注意的是如果pData下傳到函數裡,函數運行結束後pData的值仍是傳下去那一個值,就算在函數裡對pdata操作了也不會影響函數外面pdata的值,所以解析描述符的時候可以將pdata下傳到子函數裡面去解析,但是解析完成的時候記得將pdata往後移動該描述符的長度。 3.3.1 PAT和PMT表的解析

PAT結構體可以如下定義

/*PAT表結構*/

typedef struct CSTSPATSection_S

{

    DWORD m_dwTransport_Stream_Id;                                

    int  m_nLoopNum;                   //PAT表ProgramNumber的個數

    PATProgram *m_pstPATProgram;

    struct CSTSPATSection_S *m_pstNext;//以鏈表的形式儲存PAT表,這個是next指標

}PATSection;

 

PAT表ProgramNumber為0所指示的PID是NIT表的PID,如果沒有ProgramNumber為0的PID,則預設0x10為NIT表的PID;

解析PAT表只需儲存TSId、ProgramNumber及其PID;如果PAT表不止一個Section(一般是一個),還需要用鏈表的方式將資訊儲存起來

PMT表必須在PAT表解析完成之後進行解析,獲得所有當前節目的節目號(ProgramNumber)及其PID之後,就可以請求PMT表了,所以PMT表可能會有很多個,可以使用鏈表的形式儲存,也可以使用結構體數組的形式,為了和SDT等表相容,最終採用了鏈表的形式。每個PMT表都可以解析出音視頻PID的資訊,後續就可以根據這些PID去請求音視頻資料了

  3.3.2 NIT、SDT、BAT表的解析

三個表的結構如上,解析依舊按照上述PAT、PMT表的方式進行解析就可以,如果有多重迴圈就使用多個while語句進行解析,基本能解出第一重,後續多幾重迴圈也就是多寫大同小異的幾個子函數。

這幾個表是可能有多個子表的,多個子表也需要判全的,因為不像PAT表,一個頻點就只會有一個表,只要Section找全了表就收全了,而PMT表每個PID只會有一個Section,只要多個節目對應的PID收全了就OK。NIT表分為Actual和Other,分表代表當前網路和其他網路,一個網路裡面會有多個TS_id,每個TS_id代表一個頻點,每個頻點裡面有Service_id、Service_name等資訊,所以SDT子表就可以根據NIT來判全。如果是NIT Actual和SDT Actual,只需搜尋當前頻點就可以了,判全也只需判斷Section是否收全了,如果是SDT Other表,就可能會有多個子表了,要判斷除去主頻點TS_id,其他TS_id的頻點是否收全了,才可以完全判斷SDT是否收全了。BAT個人理解沒有可以提前判斷有多少個bouquet_id的方法,但是bouquet_id的個數有上限,所以BAT都是有幾個子表就收幾個


3.3.3EIT表的解析

首先,EIT表對於每一個子表的判全也是不一樣的,這部分應該跟其他表區分開來,EIT表每個Section的Section_length上限是4096,並且有segment的概念,每個segment裡面最多有8個Section,所以EIT不僅要對單個Section進行判全,還要對Segment裡面多個Section進行判全,項目解析裡面是利用Segment_last_section_number對8取餘再加一,結果就是Segment裡面Section的個數了。

對於EIT子表的判全,必須利用SDT表進行,SDT表裡面每個ServiceId下都有兩個EIT相關的欄位,分別是EIT_schedule_flag、EIT_Present_following_flag,如果兩個標記為1,就表示這個Service_Id有對應的EIT子表,根據這個就可以判全EIT子表了。


3.3.4 描述符的解析

描述符是存在於Section裡面的,可以跟表的其他重要欄位一起解析出來,解析方法大同小異。

對於PSI/SI表來說,有些描述符是比較重要的,一般都要解析出來,如下面所示:

表名

描述符

tag

描述

 

network_name_descriptor

0x40

提供網路的名稱

 

service_list_descriptor

0x41

提供網路下的節目列表

NIT

satellite_delivery_system_descriptor

0x43

提供衛星相關頻點等資訊

 

cable_delivery_system_descriptor

0x44

提供有線相關頻點等資訊

 

terrestrial_delivery_system_descriptor

0x5A

提供地面相關頻點等資訊

BAT

bouquet_name_descriptor

0x47

提供分組名稱資訊

 

service_list_descriptor

0x41

提供分組下的節目列表

SDT

service_descriptor

0x48

提供節目描述資訊

EIT

short_event_descriptor

0x4D

短事件描述符

 

extended_event_descriptor

0x4E

拓展資訊事件描述符


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.