數字電視業務PSI-SI學習系列

目錄

1.MPEG-2簡介

什麼是PSI
  在mpeg-2的傳輸流(Transport Stream)中,PSI是(Program Specific Information) 節目專用信息的簡稱,是對單一碼流的描述,PSI信息由四種類型表組成。每類表按段傳輸。分別是:PAT,CAT,PMT,NIT。

什麼是SI
  在DVB系統中,中SI是(Service Information)業務信息的簡稱,是對系統中所有碼流的描述,用於描述傳送系統、內容和廣播數據流的計劃/時間表等的數據。它包括MPEG-2的PSI信息及獨立定義的擴展部分。擴展部分由9個表組成:BAT SDT EIT RST TDT TOT ST SIT DIT。

什麼是MPEG和MPEG-2
  MPEG是Moving Picture Experts Group 的簡稱,MPEG-2是MPEG和ISO組織設計的一個數字視頻壓縮規範,主要用於DVD和DVB上,當前的標準文檔是ISO13818.

什麼是DVB
  DVB是Digtal Video Broadcast的簡稱,是歐洲所有國家和其他部分國家和地區使用的數字電視標準.其中美國的ATSC標準也是在DVB標準的基礎上實現的.

什麼是TS碼流和PS流
  TS是transport stream的簡稱,就是“傳輸流”.DVB數據廣播採用的數據格式就是TS碼流。視頻、音頻、圖片、文字等處理後成爲數據,以MPEG-2標準打包成爲固定長度(188字節)的傳送包(TS包),並將這些包複用形成傳輸流(TS流)。通常,一個頻道對應一個TS流,一個頻道的TS流由多個節目及業務組成。PS是program stream的簡稱,就是“節目流”。DVD中採用的數據格式就是PS流.這兩種流的格式是不同的,TS格式具有很強的錯誤校正功能,適合傳輸,而PS格式適合存儲在媒體中. 在這裏,着重描述的是TS碼流格式。

什麼是PID
  PID是Packet identification的簡稱,就是“包標誌符”.DVB系統把不同的數據打包成不同的數據包,用系統唯一的一個13 bits數字標誌該數據的類型.例 如,PID=0x00 表示是DVB系統中的PAT包,而PID=0x10表示是DVB系統的NIT包.不同的節目(包括Video和Audio)分別採用 不同的PID,例 如,我們在PMT表中如果檢測到PID=0x0120的PID是VIDEO數據,那麼表示包號碼是0x0120的所有包都是Video數 據,其他依此類推。

什麼是PAT
  PAT是Program Association Table的簡稱,即”節目關聯表”.PAT屬於DVB系統流中的一個表,表號碼(PID)是0x0000.PAT表描述了DVB系統流中包含什麼樣的PID,主要是描述當前流的NIT表的PID號碼是多少,當前流中有多少個不同類型PMT表,每個PMT表對應的頻道號等信息。

什麼是PMT
  PMT是Program Map Table的簡稱,即”節目映射表”。PMT的 PID 是服務器自由定義的(但不會和系統保留的PID衝突)。這個PID是在PAT表中描述的,比如,如果在PAT表中有program_map_PID爲0x100項的內容,那麼說明 所有 PID是0x100的包都是PMT表。不同的頻道有不同的PMT,也就是說,一個不同的PMT代表的是一個不同頻道。PMT表和PAT表配合在 一起, 就可以檢測出DVB流中所有存在節目的PID,因此,數字電視搜臺就是依靠這兩個表格數據完成的。

什麼是CAT
  CAT是Conditional Access Table的簡稱,即“條件訪問表”,PID是0x01.CAT攜帶的是服務器的私有信息(CA系統就需要使用該表格實現節目的解密),將一個或多個專用EMM流分別與唯一的PID相關聯。

什麼是SDT
  SDT是Service Description Table的簡稱,即“服務描述表”,PID是0x11,SDT攜帶的是業務數據比如電視臺名稱和電視節目名稱、起始時間、持續時間等。DVB接收系統接收SDT表中的節目信息,實現比較友好的界面顯示和操作.

什麼是BAT
  BAT是 Bouquet Association Table 的簡稱,即“業務羣關聯表”。給出業務羣的名稱及其業務列表等信息。將網絡中所有的業務分成了多個業務羣,比如體育業務羣,科普業務羣。這些業務
可以不在同一個傳輸流中。

什麼是NIT和EIT
  NIT是Network Information Table的簡稱,即“網絡信息表“。該表的PID是由PAT提供給出的。
  EIT是Event Information Table的簡稱,即“事件信息表”。
  NIT描述整個網絡。作用主要是對多路傳輸流的識別,NIT提供多路傳輸流,物理網絡及網絡傳輸的相關的一些信息,如用於調諧的頻率信息以及編碼方式。調製方式等參數方面的信息。
  EIT表示對某一路節目的更進一步的描述。它提供事件的的名稱,開始時間,時間長度,運行狀態等,是生成EPG的主要表。

什麼是EPG
  EPG是Electronic Programme Guides的簡稱,即“電子節目指南”.該功能可實現預告近段時間即將播放的節目內容,同時支持基於內容的檢索.生成EPG的數據來源於DVB碼流中的業務信息(SI)和節目引導信息(PSI)

什麼是teletext
  Teletext就 是 我們常說的“圖文電視”,當然在MPEG-2中,圖文電視已經數字化,也就是說,圖文信息已經做爲數字化信息在TS流中傳播.但最終,數字化的圖文信 息 都將轉化爲模擬的VBI信息插入到正常的電視信號中實現圖文電視的顯示.圖文電視有很多標準,比如close caption,WSS等,歐洲的 DVB使 用的teletext標準是ITU-R System B Teletext規格.該規格支持歐洲多種語言,支持簡單圖象和文本的混合顯示.

名詞解析
  什麼是“業務”,什麼是“事件”呢?一般來說,“業務”就是指“頻道”,“事件”就是“節目”。這裏需要明確“節目”的概念,舉個例子:CCTV1是一個頻道,也就是我們所說的“業務(Service)”;《新聞聯播》是一個節目,也就是我們所說的“事件”。分清楚了這兩個概念,我們才能區分很多SI信息。

TS流的生成與結構

這裏寫圖片描述
  不論是視頻、音頻、文字、圖片還是業務信息(包括PSI/SI)都將被劃分爲最基本的ES,並將它們通過PES的形式組裝起來,經過複用形成TS流。
這裏寫圖片描述
  對TS流的解析:首先獲取TS流中的包Packet,根據其PID過濾出需要的包,根據其section的結構還原成section,再由上層協議來處理。

ES流(ElementaryStream):基本碼流,不分段的音頻、視頻或其他信息的連續碼流。
PES流:把基本流ES分割成段,並加上相應頭文件打包成形的打包基本碼流。

2.DVB的分類

  DVB根據應用的不同,主要分爲DVB-S,DVB-C,DVB-T,DVB-H等多種規格.不同的規格基本原理都是相同的,不同的主要是調製方式不同:

DVB-S,S是Satelite的首字母,應用於數字電視衛星廣播,調製方式是QPSK.
DVB-C,C是Cable的首字母,應用於城市有線廣播.調製方式是QAM所有格式: 16QAM,32QAM,64QAM,128QAM,256QAM.
DVB-T,T是Terrestrial的首字母,應用於陸地無線廣播,調製方式是QPSK或者16QAM和64QAM.
DVB-H,H是Handheld的首字母,應用於手持無線廣播,調製方式和DVB-T相同.

  總 的 來說,不同的DVB系統只有前端系統是不同的,最終的數字信息都是相同的,也就是都是採用ISO13818描述的規格。前端系統主要是指調製方法和發 射 方法等.因此,這裏所敘述的內容,全部適用於所有的DVB系統,同時因爲美國的ATSC系統也是在DVB系統上的小量更改和小部分功能增加,因此也適 用於 ATSC標準.

基本系統描述如下:
(1)編碼系統
  假 設 信號源有6個節目,則DVB系統先對這6個節目的所有數據(Video,Audio)進行壓縮處理,然後經過一個叫做”複用”的程序進行節目的復 用 (PID分配,即對6個節目分別分配不同的PID號碼)形成叫做”PES”的包,然後再經過TS流處理程序,把這些PES包全部封裝成TS碼流格式, 最後 把獲得的TS格式的數字信號經過調製(實現的是頻率的複用),然後經過D/A轉換成模擬信號,再次調製成高頻信號,經傳輸系統發送出去.
(2)解碼系統
  接 收 系統接收到高頻信號,先轉化爲中頻信號,然後再經過一個高速的A/D轉換成數字信號,接着經過一個反調製程序,這樣就得到了TS碼流. TS碼流進入 一 個稱爲”解複用”的程序,該程序實現自動分析TS流中的表信息,讀取所有可用的PID信息等,然後提取一個用戶指定的PID(用戶選擇的節目),把 該節 目的數字信號全部接收而忽略其他不需要的信號,然後Video,Audio信號分別進入不同的解壓縮程序,分別對Video,Audio信號進行解壓縮和顯示,如果該節目包含了Teletext和EPG,也有可能同時處理Teletext和EPG,並且把處理的結果和Video信號一起疊加到屏幕 上.

Packet的概念
(1)TS流是基於Packet的位流格式,每個包是188字節或者204字節(一般是188字節,204字節的格式僅僅是在188字節的Packet後部加上16字節的CRC數據,其他格式是一樣的),整個TS流組成如下所示:

Packet 1 Packet 2 …… Packet n

  在實際使用中,因爲TS流內部已經具有很強的錯誤處理能力,所以一般使用較多的是188字節一個包的格式,204字節一個包的格式據說一般在高清節目中使用較多.

  所有的Packet格式都是統一的,包括一個Packet header和Packet datas.其中Packet header包含了同步字節(該字 節固定是0x47,表示這個包的數據開始是正確的),該Packet的唯一號碼(即PID)和其他一些信息.格式如下(用C代碼格式表示):

typedef struct
{
    unsigned sync_byte:8;           /*8 bits的同步字節*/

    unsigned transport_error_indicator:1;   /*1 bit的錯誤指示信息,1表示當前Packet至少有1bit的傳輸錯誤,0表示所有數據都正確*/

    unsigned payload_unit_start_indicator:1;/*負載單元開始標誌,請參考ISO13818-1瞭解該標誌作用*/

    unsigned transport_priority:1;      /*1 bit的傳輸優先級標誌,1表示高優先級,0表示低優先級*/

    unsigned PID:13;            /*13 bits的Packet ID號碼,唯一的號碼對應不同的包*/

    unsigned transport_scrambling_control:2;/*2 bits的加密標誌,00表示沒有加密,其他表示已被加密*/

    unsigned adaptation_field_control:2;    /* 2 bits的附加區域控制,請參考ISO13818-1瞭解該標誌作用*/

    unsigned continuity_counter:4;      /*4 bits的包遞增計數器*/
}PACKET_HEADER;

  以上結構剛好佔用32 bits,即4個字節,因此一個TS流的Packet頭部的4字節是header信息,分析該header信息就可以知道當前Packet的屬性.剩下的184字節有可能是Video數據,也有可能是Audio數據,也有可能是DVB SI信息,怎 麼 區分呢?其實很簡單,就是利用header中的PID信息.上一章說了PAT是節目關聯表,它的PID是0x0000.這個PID就是對應這 裏 header的PID.換句話就是說,如果我們發現一個Packet的PID等於0x0000,那麼說明這個Packet是DVB的PAT表格而不 是 Video數據或者Audio數據.

  實 際 上,在信號編碼成TS碼流的時候,不同節目的Video,Audio等數據都分配了不同的PID.例如,一個節目有兩路Video,三路Audio, 那麼分配PID的時候可能是Video1==0x100,Video2==0x101,Audio1==0x102,Audio2==0x103, Audio3==0x104, 這樣傳輸的TS碼流中的PID就可能有以上的PID.因此,如果我們需要在程序中過濾出第一路Video和第二路 Audio就可以這樣處理了(僞代碼描述):

void Process_Packet(unsigned char*buff)
{
    int PID=GETPID(buff);           /*從當前的188字節緩衝區中獲取PID信息*/

    if(PID==0x100)              /*PID等於第一路Video的PID,說明當前數據是Video數據*/
    {
        SaveToVideoBuffer(buff+4);  /*把header後部的數據存到Video緩衝區,待後部處理*/
    }
    else if(PID==0x103)         /*PID等於第二路Audio的PID,說明當前數據是Audio數據*/
    {
        SaveToAudioBuffer(buff+4);  /*把header後部的數據存到Audio緩衝區*/
    }
    else        /*其他PID則丟棄,當然如果PID是DVB系統保留的PID如PAT,PMT則必須處理*/
    {
        printf("unknown PID!\n");
    }
}

3.DVB SI/PSI分析和處理

返回目錄
  SI是 Specific Information的簡稱,PSI是program Specific Information的簡稱。該機制允許DVB傳送各種各樣的訊息,比如節目名稱,電視臺名稱,私有信息,甚至單獨傳送數據實現數據通信等。這些功能的實現都歸功於PSI/SI.

  在DVB標準中,定義了一些標準的PID用來實現SI/PSI.這些PID是系統保留的,因此DVB編碼的時候並不會用這些PID做爲Video PID 或者 Audio PID或者其他PID.在一個簡單的解複用程序中,只需要提供處理PAT,PMT表格的程序即可實現解複用,當然如果需要更友好的界面和實現更復雜的功能(如CA)則必須處理其他的SI表.

DVB規定攜帶SI信息的傳輸包必須用指定的PID,指定的PID如下表:

PID值
PAT 0x0000
CAT 0x0001
TSDT 0x0002
預留 0x0003 至0x000F
NIT, ST 0x0010
SDT , BAT, ST 0x0011
EIT, ST 0x0012
RST, ST 0x0013
TDT, TOT, ST 0x0014
網絡同步 0x0015
預留使用 0x0016 至 0x001B
帶內信令 0x001C
測量 0x001D
DIT 0x001E
SIT 0x001F

  上表格的PID就是DVB保留的PID,分配的其他PID一定不要佔用這些PID.解複用程序需要使用到的表只有PAT,PMT,SDT,而CA應用還需要使用CAT,EPG應用還需要使用NIT,EIT,TDT,TOT等表.所以在需要解複用的時候,僞代碼需要這樣寫:

void process_packet(unsigned char*buff)
{
    int PID=GETPID(buff);
    if(PID==0x0000)         /*這是PAT表*/
    {
        process_PAT(buff+4);    /*處理PAT表*/
    }
    else if(PID==......)        /*Video 或者Audio*/
    {

    }
    else            /*其他不支持的PID*/
    {
        printf("Unknown PID!");
    }
}

  所有的表格都存在於Packet中的184字節的數據部分,但有的時候一個表格沒有184字節,這時在Packet中就可能插入一些無效信息用來填充使整個Packet依然保持188字節.也可能用頭信息中的payload_unit_start_indicator標誌表有個偏移位置 (當 payload_unit_start_indicator=0表示表數據直接從Packet區的第四個字節開始,否則表示有一個偏移量位置開始,具體 請參考ISO13818-1,第4字節到偏移量間的數據是系統填充的無效數據).

下面針對解複用程序詳細分析一下各種表格的格式.(重要的是PAT,PMT和SDT三類)

PAT:Program Association Table,節目關聯表

返回目錄
  節目關聯表PAT(將節目號碼和節目映射表PMT的PID相關聯)的意義在於,它描述了當前TS流中包含了哪些PID;只有根據獲得的PID,用戶纔可以以此作爲憑據找出其他表(如PMT表)及其信息。所以PAT是機頂盒接收的入口點,是它獲取數據的開始;要保證一個TS流能被正常接收,則至少要有一個完整有效的PAT。

  PAT表攜帶以下信息:

(1) TS流ID— transport_stream_id,該ID標誌唯一的流ID

(2) 節目頻道號– program_number,該號碼標誌TS流中的一個頻道,該頻道可以包含很多的節目(即可以包含多個Video PID和Audio PID)

(3) PMT的PID— program_map_PID,表示本頻道使用的哪個PID做爲PMT的PID,因爲可以有很多的頻道,因此DVB規定PMT的PID可以由用戶自己定義.

PAT表定義如下:

Syntax(句法結構) 所佔位數 Identifier(識別符) Note(註釋)
program_association_section(){
table_id 8 uimsbf 標誌本表的類型,應該是0x00
Section_syntax_indicator 1 bslbf 段語法標誌,通常設爲“1”
private_indicator 1 bslbf 註釋1
Reserved 2 bslbf 保留位一般都是’0’
Section_length 12 uimsbf 段大小,單位是Bytes
transport_stream_id 16 uimsbf 當前流ID,DVB內唯一
Reserved 2 bslbf 保留位
Version_number 5 uimsbf 註釋2
Current_next_indicator 1 bslbf 註釋3
Section_number 8 uimsbf 當前段號碼
last_section_number 8 uimsbf 註釋4
for(i=0;i < N;i++){
  program_number 16 uimsbf 節目頻道號
  reserved 3 bslbf
  if(program_number == 0){
     network_PID 13 uimsbf
  }
  else{
    program_map_PID 13 uimsbf PMT的PID
  }
}
CRC_32 32 rpchof CRC校驗值,一般是會忽略的
}

各字段含義如下:

註釋1:
 private_indicator: 1bit:固定的’0’,這是爲了防止和 ISO13818 Video流格式中的控制字衝突而設置的
註釋2:
 version_number:5bits版本號碼,標註當前節目的版本.這是個非常有用的參數,當檢測到這個字段改變時,說明TS流中的節目已經變化了,程序必須重新搜索節目.
註釋3:
 current_next_indicator:1bit:當前還是未來使用標誌符,一般情況下爲’0’
註釋4:
 last_section_number:8bits最後段號碼(section_number和last_section_number的功能是當PAT內容大於184字節時,PAT表會分成多個段(sections),解複用程序必須在全部接收完成後再進行PAT的分析)

  從for()開始,就是描述了當前流中的頻道數目(N),每一個頻道對應的PMT PID是什麼.解複用程序需要和上圖類似的循環來接收所有的頻道號碼和對應的PMT PID,並把這些信息在緩衝區中保存起來.在後面的處理中需要使用到PMT PID.

  從以上分析我們可以發現,PAT表主要包含頻道號碼和每一個頻道對應的PMT的PID號碼,這些信息我們在處理PAT表格的時候會保存起來,以後會使用到這些數據.例如我們可以定義這樣的數據結構保存這些信息:

typedef struct
{
    int channel_number; /*頻道號*/
    int pmt_pid;        /*對應channel_number頻道號的PMT的PID*/
}PMT_ITEM;

PMT_ITEM pmt[64];   /*定義最多64個頻道,這個結構在分析PAT表格的時候會更新*/

PMT:Program Map Table,節目映射表

返回目錄
  節目映射表PMT的意義在於,它給出了節目號與組成這個節目元素之間的映射;也就是說,PMT是連接節目號與節目元素的橋樑。我們知道,一個電視節目至少包含了視頻和音頻數據,而每一個節目的視音頻數據都是以包的形式在TS流中傳輸的;所以說,一個TS流包含了多個節目的視頻和音頻數據包。要想過濾出一個TS流中其中一個節目的視頻和音頻,則需要知道這個節目中視頻和音頻的標識號PID。PMT表的作用就在於,它提供了每個節目視頻、音頻(或其他)數據包的PID。

當前頻道中包含的所有Video數據的PID
當前頻道中包含的所有Audio數據的PID(可以含有多路音頻)
和當前頻道關聯在一起的其他數據的PID(如數字廣播,數據通訊等使用的PID)

如果一個TS流中含有多個頻道,那麼就會包含多個PID不同的PMT表.檢測是否是PMT的僞代碼如下:

void Process_Packet(unsigned char*buff)
{
    int I;

    int PID=GETPID(buff);

    if(PID==0x0000)/*PAT表格*/
    {
        Process_PAT(buff+4);
    }
    else if(PID==.....)/*Video PID或者Audio PID*/
    {

    }
    else
    {
        /*在這裏檢測PID是否是PMT的PID*/
        for(i=0;i<64;i++)
        {
            if(PID==pmt[i].pmt_pid)/*PID等於在PAT檢測到的PMT PID相同*/
            {
                Process_PMT(buff+4);/*說明當前Packet是PMT,進入處理*/
                break;
            }
        }
    }
}

PMT定義如下:

Syntax(句法結構) 所佔位數 Identifier(識別符) Note(註釋)
program_map_section(){
table_id 8 uimsbf ID 應該是0x02
Section_syntax_indicator 1 bslbf 段語法標誌通常設爲“1”
private_indicator 1 bslbf reserved_future_use 不爲0則錯
Reserved 2 bslbf 保留位,應該是’00’
Section_length 12 uimsbf 註釋1
program_number 16 uimsbf 註釋2
Reserved 2 bslbf 保留位,應該是’00’
Version_number 5 uimsbf 註釋3
Current_next_indicator 1 bslbf 當前後續標誌符,一般是0
Section_number 8 uimsbf 當前段號碼
last_section_number 8 uimsbf 最後段號碼,含義和PAT對應
reserved 3 bslbf 保留位,一般是 ‘000’
PCR_PID 13 uimsbf 註釋4
reserved 4 bslbf 保留位,一般是’0000’
program_info_length 12 uimsbf 註釋5
for(i=0;i < N;i++){
  descriptor()
}
for(i=0;i < N1;i++){
  stream_type 8 uimsbf 註釋6
  reserved 3 bslbf 保留位
  elementary_PID 13 uimsbf 註釋7
  reserved 4 bslbf 保留位
  ES_info_length 12 uimsbf 註釋8
  for(j=0;j < N2;j++){
    descriptor();
  }
}
CRC_32 32 rpchof CRC校驗值,一般忽略
}

註釋1:
 section_length:16bits段長度,從program_number開始,到CRC_32(包含)的字節總數.
註釋2:
 program_number:16bits的頻道號碼,表示當前的PMT關聯到的頻道.換句話就是說,當前描述的是program_number頻道的信息.
註釋3:
 version_number:版本號碼,如果PMT內容有更新,則version_number會遞增1通知解複用程序需要重新接收節目信息,否則version_number是固定不變的.
註釋4:
 PCR_PID:13bits的PCR PID,具體請參考ISO13818-1,解複用程序不使用該參數.
註釋5:
 program_info_length:節目信息長度(之後的是N個描述符結構,一般可以忽略掉,這個字段就代表描述符總的長度,單位是Bytes)緊接着就是頻道內部包含的節目類型和對應的PID號碼了.
註釋6:
 stream_type:8bits基本流的類型,標誌是Video還是Audio還是其他數據.
註釋7:
 elementary_PID:13bits對應的數據PID號碼(如果stream_type是Video,那麼這個PID就是Video PID,如果stream_type標誌是Audio,那麼這個PID就是Audio PID)
註釋8:
 ES_info_length:和program_info_length類似的信息長度(其後是N2個描述符號)

  elementary_PID和stream_type的意義在於,告知接收機基本流的類型和識別PID。

附:流類型取值說明

取值 描述
0x00 國際標準保留
0x01 視頻
0x02 視頻或受限參數視頻流
0x03 音頻
0x04 音頻
0x05 private_sections
0x06 包含專用數據的PES分組
0x07 ISO/IEC 13533 MHEG
0x08
0x09 ITU-T Rec.H.222.1
0x0A~0x0D GB/T類型
0x0E GB/T輔助
0x0F~0x7F GB/T保留
0x80~0xFF 用戶專用

  從以上的分析可以看出,只要我們處理了PMT,那麼我們就可以獲取頻道中所有的PID信息,例如當前頻道包含多少個Video,共多少個Audio,和其他數據,還能知道每種數據對應的PID分別是什麼.
  這樣如果我們要選擇其中一個Video和Audio收看,那麼只需要把要收看的節目的Video PID和Audio PID保存起來,在處理Packet的時候進行過濾即可實現.

比較全面實現解複用的僞代碼如下:

int Video_PID=0x07e5,Audio_PID=0x07e6;/*一般是在PMT檢索後由用戶自己設置這兩個全局值*/

void Process_Packet(unsigned char*buff)
{
    int I;

    int PID=GETPID(buff);   /*獲取當前Packet的PID*/

    if(PID==0x0000) /*0x0000表示是PAT*/
    {
        Process_PAT(buff+4);
    }
    else if(PID==Video_PID) /*和Video_PID相等,說明當前Packet是一個Video Packet*/
    {
        SaveToVideoBuffer(buff+4);  /*保存到Video緩衝區*/
    }
    else if(PID==Audio_PID) /*和Audio_PID相等,說明當前Packet是一個Audio Packet*/
    {
        SaveToAudioBuffer(buff+4);  /*保存到Audio緩衝區*/
    }
    else
    {
        for( i=0;i<64;i++)
        {
            if(PID==pmt[i].pmt_pid)
            {
                Process_PMT(buff+4);
                Break;
            }
        }
    } 
}

  以上僞代碼可以實現基本的解複用:檢測所有的頻道,檢測所有stream的PID,選擇特定的節目進行播放.只要讀取每個Packet的188字節的內容,然後每次都調用Process_Packet()即可實現簡單的解複用.

CAT:Conditional Access Table,條件訪問表

返回目錄
  條件接收表CAT描述了節目的加密方式,它包含了節目的EMM(Entitlement Management Message,即授權管理信息。描述了用戶可看的節目或時間段、用戶的付費等)識別PID。它給出了一個或多個CA系統、EMM流以及與CA相關的特定參數之間的關係。
  CA描述符既用於規定像EMM這樣的系統範圍條件接收管理信息,也用於規定像ECM這樣的基本流特定信息。如果一個基本流(Elementary Stream)是加擾的,那麼包含該基本流的節目信息表PMT中需要一個CA描述符,如果一個TS流中有任何一個系統範圍的條件接收管理信息,則條件接收表中應有CA描述符。

CAT的表結構分析(數據成員含義無需贅言,跟上面的幾乎一致)

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符) Note(註釋)
conditional_access_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常設爲 1
0 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf
reserved 18 bslbf
Version_number 5 uimsbf
Current_next_indicator 1 bslbf
Section_number 8 uimsbf
last_section_number 8 uimsbf
for(i=0;i < N;i++){
  descriptor()
}
CRC_32 32 rpchof
}

  條件存取段主要作用是指示本TS流中存在加擾節目,並且在描述符循環中必須插入CA描述符來作進一步指引。下面給出的是條件接收的描述符

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
CA_identifier_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
CA_system_ID 16 uimsbf
reserved 3 bslbf
CA_PID 13 uimsbf
for(i=0;i < N;i++){
  private_data_byte 8
}
}

CA_system_ID(CA系統ID):指出用於相關ECM及(或)EMM流的CA系統類型。
CA_PID(CA PID):指出包含用於相關CA_system_ID所規定的CA系統的ECM或EMM信息傳輸流分組的PID(即在TS流中過濾出相應PID的分組)。

以上參考博客:
PSI/SI深入學習2——PSI信息解析(PAT,PMT,CAT)

BAT:BouquetAssociation Table,業務羣關聯表

返回目錄
  BAT即業務羣關聯表(Bouquet Association Table),它將網絡中所有的業務分成了多個業務羣,以此界定用戶。例如,將網絡中所有業務分爲兩個業務羣,一個是境內節目業務羣,另一個是境外節目業務羣。這樣,國內的運營商就可以利用這樣劃分的業務羣,充分利用節目資源,在不違反現有廣電總局規定的前提下,同時分別滿足境內用戶和境外用戶。BAT本身可以跨網絡存在,但在國內運營體系來看幾乎沒有得到真正使用。國內的運營使用中,BAT還可以存在分級運營的運營體系中,用於區分不同的地域用戶。
  BAT被切分爲業務羣關聯段,所有的業務羣關聯段都在TS中傳輸,其PID爲0x0011。所有的業務羣關聯段的table_id都取0x4A。

SDT的TS包PID也爲0x0011,其table_id爲0x42或0x46。

BAT表的段結構:

Syntax(句法結構) No. ofbits Identifier(識別符) Note(註釋)
bouquet_association_section(){
table_id 8 uimsbf 0x4A
Section_syntax_indicator 1 bslbf 通常設爲1
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 註釋1
bouquet_id 16 uimsbf 註釋2
Reserved 2 bslbf
Version_number 5 uimsbf 註釋3
Current_next_indicator 1 bslbf 註釋4
Section_number 8 uimsbf 註釋5
last_section_number 8 uimsbf 子表的最後一個段的段號
Reserved_future_use 4 bslbf
bouquet_descriptors_length 12 uimsbf 註釋6
for(i=0;i < N;i++){
  descriptor()
}
reserved_future_use 4 bslbf
transport_stream_loop_length 12 uimsbf 註釋7
for(i=0;i < N;i++){
  transport_stream_id 16 uimsbf 同一個傳輸系統中不同的複用碼流
  original_network_id 16 uimsbf 原始傳輸系統的network_id
  reserved_future_use 4 bslbf
  transport_descriptors_length 12 uimsbf 註釋8
  for(j=0;j < N;j++){
    descriptor()
  }
}
CRC_32 32 rpchof CRC值
}

註釋1:
  前兩位置”00”。它表示從該字段的下一個字節開始的本段的字節長度,幷包含CRC。section_length不能超過1021,這樣整個段的最大長度爲1024字節。
註釋2:
  業務羣標識符,用於標識業務羣。該字段值的分配見ETR 162。
註釋3:
  標識子表的版本號。當子表包含的信息發生變化時,version_number加1。當值增至31時,復位爲0。當current_next_indicator置“1”時,則version_number爲由table_id和bouquet_id定義的當前使用的子表的版本號。當current_next_indicator置“0”時,則version_number爲由table_id和bouquet_id定義的下一個使用的子表的版本號。
註釋4:
  當前後續指示符current_next_indicator:1位指示符。當被置“1”時,表示當前子表正被使用。當其置“0”時,表示所傳子表尚未被使用,它是下一個將被使用的子表。
註釋5:
  段號,子表中的第一個段的section_number標爲“00”。每增加一個具有相同的table_id和bouquet_id的段,section_number就加1。
註釋6:
  業務羣描述符長度,給出了從本字段的下一個字節開始的業務羣描述符的總字節長度。
註釋7:
  傳輸流循環長度,定義了從本字段的下一個字節到第一個CRC-32字節之前的傳輸流循環的總字節長度。
註釋8:
  傳輸流描述符長度,指出從本字段的下一個字節開始的TS描述符的總字節長度。

  BAT可以插入傳輸系統描述符、業務列表描述符等。

  BAT的業務羣名稱描述符結構 ANALYZE OF THE STRUCTURE OF BOUQUET_NAME_DESCRIPTORINBAT

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
bouquet_name_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i < N;i++){
  char 8 uimsbf
}
}

  char(字符):8位字段,用於描述BAT子表敘述的節目業務羣名稱

業務名稱描述符和網絡名稱描述符類型,只是作爲業務羣的一個代號,其實際意義只存在於用戶界面上,可以給用戶一個良好的操作體驗。

總結一下DVB搜臺的原理

返回目錄
  機頂盒先調整高頻頭到一個固定的頻率(如498MHZ),如果此頻率有數字信號,則COFDM芯片(如MT352)會自動把TS流數據傳送給 MPEG-2 decoder. MPEG-2 decoder先進行數據的同步,也就是等待完整的Packet的到來.然後循環查找是否出現 PID== 0x0000的Packet,如果出現了,則馬上進入分析PAT的處理,獲取所有的PMT的PID.接着循環查找是否出現PMT,如果發現 了,則自動進入PMT分析,獲取該頻段所有的頻道數據並保存.如果沒有發現PAT或者沒有發現PMT,說明該頻段沒有信號,進入下一個頻率掃描.

  從以上描述可以看出,機頂盒搜索頻率是隨機發生的,要使每次機頂盒都能搜索到信號,則要求TS流每隔一段時間就發送一次PAT和PMT.事實上DVB傳輸系統就是這麼做的.因此無論何時接入終端系統,系統都能馬上搜索到節目並正確解複用實現播放.不僅僅如此,其他數據也都是交替傳送的.比如第一個Packet可能是PAT,第二個Packet可能是PMT,而第三個Packet可能是Video 1,第四個Packet可能是Video 2,只要系統傳輸速度足夠快(就是稱之爲”碼率”的東東),實現實時播放是沒有任何問題的。

  到這裏雖然實現瞭解複用,但可以看出,使用的PID都是枯燥的數字,如果調臺要用戶自己輸入數字那可是太麻煩了,而且還容易輸入錯誤,操作非常不直觀,即使做成一個菜單讓用戶選擇也是非常的呆板.針對這個問題,DVB系統提出了一個SDT表格,該表格標誌一個節目的名稱,並且能和PMT中的PID聯繫起來,這樣用戶就可以通過直接選擇節目名稱來選擇節目了。

SDT, Service description Table,服務描述表

  SDT即服務描述表(Service Description Table),它描述了一個業務中的內容以及信息,它承上啓下,以transport_stream_ID連接了NIT和EIT;SDT的servicID必須與PMT中的Program_no一致,因此,SDT又與PSI的信息連接。
  對於一般的音視頻業務,SDT表中不會有太多的信息需要添加。如果是其他業務(如NVOD、馬賽克、數據廣播等),在SDT中需要插入相應業務的描述符。
  SDT表被切分成業務描述段(service_description_section),由PID爲0x0011的TS包傳輸(BAT段也由PID爲0x0011的TS包傳輸,但table_id不同)。
  描述現行TS(即包含SDT表的TS)的SDT表的任何段的table_id都爲0x42,且具有相同的table_id_extension(transport_stream_id)以及相同的original_network_id。指向非現行TS的SDT表的任何段的table_id都應取0x46。
  SDT可以提供的信息包括,該節目是否在播放中,該節目是否被加密,該節目的名稱。每一個傳輸流中都有一個獨立的sdt子表。爲了提高對service的採集,定義了下列規則:

強制傳輸當前ts的sdt
sdt列出的si比特流至少包括ts中所有服務
當前ts(例如table_id=0x46)中sdt描述其他ts時,應當列出這個ts的所有service

下面給出了SDT的業務描述段:

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符) Note(註釋)
service_description_section(){
table_id 8 uimsbf 註釋1
Section_syntax_indicator 1 bslbf 通常設爲1
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 註釋2
transport_stream_id 16 uimsbf 當前描述的流ID
Reserved 2 bslbf
Version_number 5 uimsbf 版本號碼,如果數據更新則此字段遞增1
Current_next_indicator 1 bslbf 註釋3
Section_number 8 uimsbf
last_section_number 8 uimsbf
original_nerwork_id 16 uimsbf 原始網絡ID號
reserved_future_use 8 bslbf
for(i=0;i < N;i++){ N個節目信息的循環
  service_id 16 uimsbf 註釋4
  reserved_future_use 6 bslbf
  EIT_schedule_flag 1 bslbf 註釋5
  EIT_present_following_flag 1 bslbf 註釋6
  running_status 3 uimsbf 註釋7
  freed_CA_mode 1 bslbf ‘1’表示該節目被加密
  descriptors_loop_length 12 uimsbf
  for(j=0;j < N;j++){
    descriptor()
  }
}
CRC_32 32 rpchof 校驗
}

各字段定義如下:

註釋1:
  table_id:8bits的ID,可以是0x42,表示描述的是當前流的信息,也可以是0x46,表示是其他流的信息(EPG使用此參數)
註釋2:
  section_length:12bits的段長度,單位是Bytes,從transport_stream_id開始,到CRC_32結束(包含)
註釋3:
  current_next_indicator:當前未來標誌,一般是0,表示當前馬上使用。
註釋4:
  service_id:16 bits的服務器ID,實際上就是PMT段中的program_number.
註釋5:
  EIT_schedule_flag:1bit的EIT信息,1表示當前流實現了該節目的EIT傳送
註釋6:
  EIT_present_following_flag:1bits的EIT信息,1表示當前流實現了該節目的EIT傳送
註釋7:
  running_status:3bits的運行狀態信息:0-未定義,1-未播放 2-幾秒鐘後馬上開始,3-被暫停播出,4-正在播放,5~7—保留

  SDT是描述一個TS流中所有業務信息的一張表,重要的字段包含transport_stream_id,明確這些業務是屬於哪個TS流的;另一個重要字段時候service_id,這是作爲頻道索引信息存在的。

  緊接着的是描述符,一般是Service descriptor,分析此描述符可以獲取servive_id指定的節目的節目名稱。

SDT的業務描述符分析 ANALYZE OF THE STRUCTURE OF SERVICE_DESCRIPTOR IN SDT
業務描述符與業務類型一起,以文本形式給出業務提供者的名稱和業務名稱,如下表:

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
service_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
service_type 8 uimsbf
service_provider_name_length 8 uimsbf
for(i=0;i < N;i++){
  Char 8 uimsbf
}
service_name_length 8 uimsbf
for(i=0;i < N;i++){
  Char 8 uimsbf
}
}

業務類型:這裏的業務類型和NIT中的 業務列表描述符 中的service_type編碼是一致的:

service_type 描述
0x00 預留使用
0x01 數字電視業務
0x02 數字音頻廣播業務
0x03 圖文電視業務
0x04 NVOD參考業務
0x05 NVOD時移業務
0x06 馬賽克業務
0x07 PAL制編碼信號
0x08 SECAM制編碼信號
0x09 D/D2-MAC
0x0A 調頻廣播
0x0B NTSC制信號
0x0C 數據廣播業務
0x0D 公共接口使用預留
0x0E RCS映射(見EN 301 790)
0x0F RCS FLS(見EN 301 790)
0x10 DVB MHP業務
0x11~0x7F 預留使用
0x80~0xFE 用戶定義
0xFF 預留使用

  業務描述符是SDT中最重要的描述符,也是運營商中必須的描述符。其中的service_type描述這個業務類型的域;service_name描述頻道名。

  至此分析完畢,節目名稱和節目號碼已經聯繫起來了.機頂盒程序就可以用這些節目名稱代 替 PID讓用戶選擇,從而實現比較友好的用戶界面。
PSI/SI深入學習3——SI信息解析2(SDT, EIT, TDT,TOT)

4.EPG原理

  EPG就 是“電子節目指南”,相當於一個節目菜單的功能.在一個TS流中,可以提供當前流的所有信息,如頻率,調製方式,頻道號,所有節目的PID,名稱等信息, 也可以根據需要提供其他相關聯的TS流(例如同一電視臺同步播放的其他頻率的節目信息)的信息.解碼器接收這些信息,形成一個固定格式的菜單讓用戶選擇需要收看的頻道或節目,這就是”EPG”.不僅如此,EPG還可以對節目進行分類,比如節目可以是電影,也可以是新聞,這樣,把屬於電影的節目歸在一 起,把 屬於新聞的節目歸在一起,這樣對用戶來說檢索節目就變得非常的方便.

  EPG的實現也歸功於DVB的SI信息.和EPG功能相關的SI有NIT(網絡信息表),EIT(環境信息表),SDT(服務描述表),BAT(羣組關聯表),TDT(日期時間表)和TOT(時間偏移表).下面簡單分析這些表所攜帶的信息.NIT,Network Information Table,網絡信息表NIT提供如網絡名稱(相當於電視臺名稱),傳輸參數(如頻率,調製方式等).這個表格一般是解碼器內部使用的數據,當然也可以做爲EPG的一個顯示數據提供給用戶做爲參考.

NIT: Network Information Table,網絡信息表

返回目錄
  NIT提供如網絡名稱(相當於電視臺名稱),傳輸參數(如頻率,調製方式等).這個表格一般是解碼器內部使用的數據,當然也可以做爲EPG的一個顯示數據提供給用戶做爲參考,但這個表本身的信息有限,更多的信息是依靠插入表中的描述符來提供的。NIT常用的描述符有:網絡名稱描述符(network_name_descriptor)、有線傳送系統(cable_delivery_system_descriptor)、業務列表描述符(service_list_descriptor)和鏈接描述符(linkage_descriptor)。

NIT的表結構分析 ANALYZE OF THE STRUCTURE OF NIT
  網絡信息表(NIT)傳遞了與通過一個給定的網絡傳輸的複用流/TS流的物理結構相關的信息,以及與網絡自身特性相關的信息。

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符) Note(註釋)
network_information_section(){
table_id 8 uimsbf 註釋0
Section_syntax_indicator 1 bslbf 通常設爲 1
Reserved_future_use 1 bslbf 保留未來使用位,一般是 0
Reserved 2 bslbf 一般是’00’,防止控制字衝突而設置
Section_length 12 uimsbf 註釋1
Network_id 16 uimsbf 註釋2
Reserved 2 bslbf 保留意見位
Version_number 5 uimsbf 註釋3
Current_next_indicator 1 bslbf 當前下次使用標誌,一般是’0’
Section_number 8 uimsbf 當前段號碼
last_section_number 8 uimsbf 見註釋
Reserved_future_use 4 bslbf 未來使用,應該是’0000’.
Network_descriptors_length 12 uimsbf 網絡描述符長度,字節單位
for(i=0;i < N;i++){ N個不同的描述符結構
  descriptor() //First descriptor loop註釋4
}
reserved_future_use 4 bslbf 保留位,當前應是’0000’
transport_stream_loop_length 12 uimsbf 隨後的循環的字節總數
for(i=0;i < N;i++){
  transport_stream_id 16 uimsbf
  original_network_id 16 uimsbf 註釋5
  reserved_future_use 4 bslbf
  transport_descriptors_length 12 uimsbf 隨後的N個描述符佔用的字節總數
  for(j=0;j < N;j++){
     descriptor() //Second descriptor loop 註釋6
  }
}
CRC_32 32 rpchof 整個段的CRC校驗值,一般可以忽略.
}

NIT格式如下:

註釋0:
  table_id:8 bits標誌,應該是0x40或0x41.當table_id==0x40時候,這個NIT描述的是當前流的網絡信息,否則描述的是其他流的網絡信息(一般是電視臺同步播放的其他TS流信息).
註釋1:
  section_length:12bits段長度,從network_id開始,到CRC_32(包含)結束的字節總數.
註釋2:
  network_id:16bits的網絡ID號碼,DVB內唯一的一個號碼,標誌不同的電視臺.
註釋3:
  version_number:5bits的版本號碼,當NIT內容有任何改變時,該字段會遞增1(提醒解碼器更新NIT信息).
註釋4:
  descriptor():,一般是網絡名稱描述符,解碼器在此獲取當前的網絡名稱(即電視臺名稱)
註釋5:
  original_network_id:16bits原始網絡ID.如果original_network_id== transport_stream_id說明該TS流是直播節目,否則說明該TS流是轉播節目.
註釋6:
  descriptor(),N個描述符,可以有多個連續但不相同的描述符號,如網絡名稱描述符,傳輸系統參數描述符,解碼器分析這些描述符獲取網絡的不同信息.

  在SI標準中規定:original_network_id和transport_stream_id兩個標識符相結合唯一確定了網絡中的TS流。各網絡被分配獨立的network_id值作爲網絡的唯一識別碼。當NIT表在生成TS流的網絡上傳輸時,network_id和original_network_id將取同一值。

NIT表被切分爲網絡信息段(network_information_section)
任何NIT的段都必須由PID爲0x0010的TS包傳輸
現行網絡的NIT表任何段的table_id值應爲0x40,且具有相同的table_id_extension即(network_id);
現行網絡以外的其他網絡NIT表的段table_id值應爲0x41

  注意到這裏出現了兩個循環,分別稱爲爲第一層循環和第二層循環;每層循環都插入了一個描述符,也就是一共插入了兩個描述符。第一層描述符 作用域是針對整個網絡的,如插入網絡名稱描述符、鏈接描述符等 ;第二層描述符 作用域是第一層循環所代表的一個TS流,如插入有線傳輸系統描述符 。

NIT的業務列表描述符結構分析

ANALYZE OF THE STRUCTURE OF SERVICE_LIST_DESCRIPTOR IN NIT
返回目錄
  業務列表描述符通過業務標識符和業務類型提供業務服務。其目的在於:告訴接收機每一個TS流中存在多少個業務以及每一個業務的類型。其結構如下:

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
service_list_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i < N;i++){
  service_id 16 uimsbf
  service_type 8 uimsbf
}
}

service_id(業務標識符):唯一標識TS中的一個業務,它與program_map_section中的program_number(參看PMT表結構)相同。但當業務類型爲0x04時(即NVOD參考業務),service_id沒有對應的program_number。
service_type(業務類型):指示業務的類型。如0x01爲數字電視業務,0x02爲數字音頻廣播業務,0x04爲NVOD參考業務,0x05爲NVOD時移業務。

注意這裏的service_type 和前面提到的 SDT業務描述符的service_type定義是完全一致的。

NIT的有線傳輸系統描述符結構分析

ANALYZE OF THE STRUCTURE OF CABLE_DELIVERY_SYSTEM_DESCRIPTOR IN NIT
返回目錄
  有線傳輸系統描述符(Cable_Delivery_System_descriptor)是NIT業務中重要的描述符,也是基本運營所必需的描述符。它主要描述了每一個TS流的物理參數(頻率、調製方式、符碼率等),使接收機能正確鎖頻、得到數據。其結構如下:

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
cable_delivery_system_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
frequency 32 bslbf
reserved_future_use 12 bslbf
FEC_outer 4 bslbf 前向糾錯外碼
modulation 8 bslbf
symbol_rate 28 bslbf
FEC_inner 4 bslbf 前向糾錯內碼
}

Frequency(頻率):32位,以8個4位BCD碼給出頻率。其單位是MHz,小數點位於第四個BCD碼之後,如0312.0000MHz。
Modulation(調製方式):指出有線傳輸系統的調製方式。其定義如下表:

調製方式(十六進制) 描述
0x00 未定義
0x01 16 QAM
0x02 32 QAM
0x03 64 QAM
0x04 128 QAM
0x05 256 QAM
0x06~0xFF 預留使用

symbol_rate(符碼率):28位,以7個4位BCD碼錶示符碼率。其單位是MSPS(兆符號每秒),小數點位於第三個BCD碼後,如027.4500 MSPS

NIT的網絡名稱描述符結構分析

ANALYZE OF THE STRUCTURE OF NETWORK_NAME_DESCRIPTOR IN NIT
返回目錄
  網絡名稱描述符的功能比較簡單,它以字符串的形式將網絡的名稱告訴接收機。下面是其描述符結構列表:

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
network_name_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i < N;i++){
  char 8 uimsbf
}
}

  char(字符):8位字段,一個字符串,給出NIT表指定的傳送系統的名稱。

NIT的鏈接描述符結構分析

ANALYZE OF THE STRUCTURE OF LINKAGE_DESCRIPTOR IN NIT
返回目錄

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
linkage_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
transport_stream_id 16 uimsbf
original_network_id 16 uimsbf
service_id 16 uimsbf
linkage_type 8 uimsbf
for(i=0;i < N;i++){
  private_data_byte 8 bslbf
}
}

  如果用戶要求得到SI系統描述的特定實體的進一步信息,則可以使用鏈接描述符。鏈接描述符包含的信息給出了該實體的位置。如:可以在一個NIT中使用一個鏈接描述符,給出網絡中可存放業務附加信息的位置;或者在BAT表中的鏈接描述符可鏈接到業務羣的相關信息等。
  使用鏈接描述符,也可以提供一種業務,以替換CA系統的功能。如果CA系統不能處理相應功能的時候,接收機就可以用這個業務來取代CA。
  使用鏈接描述符,還可以以一種備用業務,用以替換主業務。若主業務的運行狀態被置爲“not_running”,那麼,接收機可以自動選擇被鏈接描述符指引的備用業務,以取代該業務。
  使用鏈接描述符,還可以向移動接收機提供漫遊功能。若現行業務其service_id下無法使用,IRD可以自動選擇該功能。hand-over_type指明link_descriptor是否鏈接到不同國家的同一業務,或者鏈接到本地變更業務或關聯業務。
  總之,鏈接描述符爲運營商提供了一種業務擴充功能,使得運營商可以更加靈活地組合各種業務。

EIT : Event Information Table,事件信息表

返回目錄
  事件信息表提供如下信息:節目段的標識號、起始時間、節目長度、播放狀態、是否加密;指向特定信息的鏈接信息;節目段多語種的簡短介紹;節目段的詳細介紹;兩段同樣節目段的時間偏移;基本碼流類型,如視頻的幅型比、伴音的類型、字幕的類型等;使用的加密系統;節目類型,如電影/戲劇、新聞、綜藝、體 育、少 兒、音樂、藝術、社會政治、文教等;節目限定年齡的級別;給出實現交互式回傳信道的電話號碼;爲滿足各節目段的碼率而提供的緩存大小信息及私有數 據等。是EPG中絕大部分信息的攜帶者。事實上,EPG主要就是通過SDT和EIT信息的獲取和重組實現的。SDT只提供了頻道信息,而EIT則提供各頻道下的所有節目的信息。
  事件信息表中提供了類似於廣播電視報所提供的節目表的內容,在SI中,只有EIT纔有可能被加密。根據EIT及其它表所提供的信息,可以出五花八門的電子節目指南。-如:按節目類型檢索、按時間檢索及對某類節目的鎖定等.
  EIT的主要信息也是通過插入的描述符來實現的。EIT按照時間順序提供每一個業務所包含的事件的相關信息(如節目名稱、節目簡介)。

傳輸流 信息 table_id
當前TS流 當前/後續事件信息 0x4E
其他TS流 當前/後續事件信息 0x4F
當前TS流 事件時間表信息 0x50~0x5F
其他TS流 事件時間表信息 0x60~0x6F

  按照不同的table_id,一共有四類EIT。其中,當前TS流的所有EIT子表都有相同的transport_stream_id和original_stream_id。

EIT的表結構分析 ANALYZE OF THE STRUCTURE OF EIT
  EIT表被切分成事件信息段。任何構成EIT的段都由PID=0x0012的TS包傳輸。下面給出的是事件信息段的結構:

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符) Note(註釋)
event_information_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常設爲 1
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 見註釋
service_id 16 uimsbf 與PAT中的 program_number 一致
Reserved 2 bslbf
Version_number 5 uimsbf 見註釋
Current_next_indicator 1 bslbf 見註釋
Section_number 8 uimsbf 見註釋
last_section_number 8 uimsbf 見註釋
transport_stream_id 16 uimsbf 見註釋
original_nerwork_id 16 uimsbf 見註釋
segment_last_section_number 8 uimsbf 見註釋
last_table_id 8 uimsbf 見註釋
for(i=0;i < N;i++){
  event_id 16 uimsbf 事件(節目)id
  start_time 40 bslbf 事件(節目)開始時間
  duration 24 bslbf 事件(節目)持續始時間
  running_status 3 uimsbf 見註釋
  freed_CA_mode 1 bslbf 見註釋
  descriptors_loop_length 12 uimsbf
  for(j=0;j < N;j++){
    descriptor()
  }
}
CRC_32 32 rpchof 見註釋
}

start_time(開始時間):40位字段,指的是事件(節目)的開始時間,它包含以UTC和MJD形式表示的事件(節目)的起始時間及日期。此字段前16位表示MJD日期碼,其餘24位按4位BCD編碼,表示6個數字。例如:93/10/13 12:45:00被編碼爲:“0xc079124500”

如果事件起始時間未定,則所有位都置爲“1”,例如對NVOD業務的一個事件。

duration(持續時間):24位字段,表示事件的持續時間,以時、分、秒的格式表示,即由6個4位BCD碼顯示。如:01:45:30被編碼爲“0x14530”。
running_status(運行狀態):參看SDT表解析部分。

  EIT主要承載的信息就是Event的相關內容,即節目信息。其中,節目所在頻道(service_id)、開始時間(start_time)、結束時間(start_time+duration)可在EIT子表獲取;而節目描述、節目名稱、節目分類等信息就要在插入EIT的描述符中獲取了。

EIT的短事件描述符分析

ANALYZE OF THE STRUCTURE OF SHORT_EVENT_DESCRIPTOR IN EIT
返回目錄
  短事件描述符(Short_event_descriptor)以文本方式提供了事件名稱和該事件的簡短描述。描述符結構如下:

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
short_event_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
ISO_639_language_code 24 bslbf
event_name_length 8 uimsbf
for(i=0;i < event_name_length;i++){
  event_name_char 8 uimsbf
}
text_length 8 uimsbf
for(i=0;i < text_length;i++){
  text_char 8 uimsbf
}
}

  ISO_639_language_code(ISO 639-2語言代碼):24位字段,指明後續文本字段的語言。該字段包含一個由ISO 639-2定義的3字符代碼。ISO 639-2/B和ISO 639-2/T均可使用。每個字符按照GB/T15273.1-1994編碼爲8位,並依次插入24位字段。如:法語的3字符代碼“fre”,可編碼爲:“0110 01100111 0010 0110 0101”。
  event_name_char(事件名稱字符):一個字符串給出事件的名字。
  text_char(文本字符):一個字符串給出事件的文本描述。

EIT的擴展事件描述符分析

返回目錄
ANALYZE OF THE STRUCTURE OF EXTENDED_EVENT_DESCRIPTOR IN EIT
  擴展事件描述符(Extended_Event_Descriptor)擴展事件描述符給出了一個事件的詳細文本描述。如果一個事件的信息長度超過256字節,可以使用多於一個相關聯的擴展事件描述符來描述。文本信息可以分爲兩個欄目,一欄爲條目的描述,另一欄爲條目的內容。

Syntax(句法結構) No. ofbits(所佔位數) Identifier(識別符)
extended_event_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
descriptor_number 4 uimsbf
last_descriptor_number 4 uimsbf
ISO_639_language_code 24 bslbf
length_of_items 8 uimsbf
for(i=0;i < N;i++){
  item_description_length 8 uimsbf
  for(j=0;j < N;j++){
    item_description_char 8 uimsbf
  }
  item_length
  for(j=0;j < N;j++){
    item_char
  }
}
text_length
for(i-0;i < N;i++){
  text_char
}
}

RST:Running Status Table,運行狀態表

返回目錄
  運行狀態表(RST)能準確而迅速地的更新一個或多個事件的時間狀態。因爲時間表的變化,事件的開始可能提前或滯後,所以RST表的存在是非常必要的。使用一個獨立的表可以保證快速更新機制的實現。
  RST表被切分成運行狀態段。任何構成RST表的段,都要由PID爲0x0013的TS包傳輸,table_id值爲0x71。

各字段含義如下:

Syntax(句法結構) 所佔位數 Identifier(識別符) Note(註釋)
running_status_section(){
table_id 8 uimsbf ID標誌,應該是0x71
section_syntax_indicator 1 bslbf 段語法標誌,應該是 1
reserved_future_use 1 bslbf 未來保留位
reserved 2 bslbf 保留位
section_length 12 uimsbf 註釋1
for(i=0;i < N;i++){
  transport_stream_id 16 uimsbf TS ID,DVB內唯一
  original_network_id 16 uimsbf 原始網絡ID
  service_id 16 uimsbf 節目號,和PMT內的program_number相同含義.
  event_id 16 uimsbf 環境ID,同EIT定義
  reserved_future_use 5 bslbf 未來保留位
  running_status 3 uimsbf 註釋2
}
}

註釋1:
  section_length:12bits段長度,單位Bytes.實際就是隨後的for()循環中所有的字節數目.

註釋2:
  running_status:3bits運行狀態.0x01表示不在播放中,0x02表示即將播放,0x03表示播放被暫停,0x04表示正在正常播放,其他屬於未定義狀態.

  以上標準SI表提供出的EPG信息是比較少的,實際上有用的EPG信息都是包含在描述符中,就是Table結構內部的descriptor()字 段 中.DVB系統提供了很多標準的descriptor(),不同的描述符展示不同的信息.具體的描述符結構請參考EN300468.

標準描述符簡單介紹如下:
(1) Bouquet name descriptor:組名稱描述符,提供一個組的名稱符號.

(2) CA identifier descriptor:CA系統控制字描述符,提供CA的加密字.

(3) Component descriptor:組件描述符號,提供系統內所有組件的名稱等信息.

(4) Content descriptor:內容描述符號,提供系統節目的內容信息(實現按內容檢索功能)

(5) Country availability descriptor:有效國家列表描述符號,提供該服務允許使用的國家名稱列表.

(6) Data broadcast descriptor:數據廣播描述符,提供數據廣播信息.

(7) Data broadcast id descriptor:數據廣播標誌描述符號.

(8) Cable delivery system descriptor:DVB-C傳輸系統參數描述符,提供DVB-C參數信息.

(9) Satellite delivery system descriptor:DVB-S傳輸系統參數描述符,提供DVB-S參數信息.

(10) Terrestrial delivery system descriptor:DVB-T傳輸系統參數描述符,提供DVB-T參數信息.

(11) Extended event descriptor:擴展環境描述符號.

(12) Frequency list descriptor:頻率列表描述符,提供所有的頻率信息.

(13) Linkage descriptor:可連接描述符.

(14) Local time offset descriptor:當前時間信息.

(15) Mosaic descriptor:馬塞克描述符.

(16) Multilingual bouquet name descriptor:多語言代碼組名稱描述符.

(17) Multilingual component descriptor:多語言組件描述符號.

(18) Multilingual network name descriptor:多語言網絡名稱描述符.

(19) Multilingual service name descriptor:多語言服務名稱描述符.

(20) NVOD reference descriptor:VOD點播參考描述符.

(21) Network name descriptor:網絡名稱描述符.

(22) Private data specifier descriptor:私有數據描述符.

(23) Short smoothing buffer descriptor:傳輸速率描述符.

(24) Service descriptor:服務器描述符,提供電視臺名稱和電視節目名稱等信息.

(25) Service list descriptor:節目列表描述符,提供所有的節目頻道號和節目類型.

(26) Service move descriptor:節目刪除描述符.

(27) Short event descriptor:短消息描述符.

(28) Stream identifier descriptor:流標誌描述符.

(29) Stuffing descriptor:填充數據描述符.

(30) Subtitling descriptor:子字幕描述符.

(31) Telephone descriptor:電話號碼描述符.

(32) Teletext descriptor:圖文信息描述符.

(33) Time shifted event descriptor:時間消逝環境描述符.

  以 上 描述符結構定義在EN300468,所有的描述符都插入到不同的SI表中,因此描述符的分析應該結合不同的SI表來進行.但是這種插入又是有規律的, 如 NIT表只可能插入Terrestrial delivery system descriptor之類或 者 Network name descriptor,絕對不可能插入Service descriptor!具體插入的什麼描述符,只能通過描述符的第 一個 字節descriptor_tag來判斷.

  因 爲 EPG的實現是非常靈活的,不同的應用需要不同的EPG功能,因此在 Seekfor MPEG-2 decoder 中 沒有加入EPG功能.然而實際上,EPG功能比較容易實現,但因爲EPG錯綜複雜的SI,寫EPG功能之前還是需要仔細理清思路才能實現的.

參考文章:
數字電視業務PSI/SI學習系列

發佈了43 篇原創文章 · 獲贊 21 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章