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

來源:互聯網
上載者:User

 

一、MPEG-2系統原理
                                                                        第一章 MPEG-2簡介
什麼是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碼流.
      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)是0x00.PAT表描述了DVB系統流中包含什麼樣的PID,主要是描述當前流的NIT表格的PID號碼是多少,當前流中有多少個不同類型PMT表,每個PMT表對應的頻道號等資訊.
什麼是PMT?
      PMT是Program Map Table的簡稱,即”節目影射表”.PMT的PID 是伺服器自由定義的(但不會和系統保留的PID衝突).這個PID是在PAT表中描述的,比如,如果在PAT表中有0x100項的內容,那麼說明所有 PID是0x100的包都是PMT表.不同的頻道有不同的PMT,也就是說,一個不同的PMT代表的是一個不同頻道.PMT表格和PAT表格配合在一起, 就可以檢測出DVB流中所有存在節目的所有PID,因此,數字電視搜台就是依靠這兩個表格式資料完成的.
什麼是CAT?
      CAT是Conditional Access Table的簡稱,即”條件訪問表”,PID是0x01.CAT攜帶的是伺服器的私人資訊(CA系統就需要使用該表格實現節目的解密).
什麼是SDT?
      SDT是Service Description Table的簡稱,即”伺服器描述表”,PID是0x11.SDT攜帶的是電視台名稱和電視節目名稱.DVB接收系統接收SDT表中的節目資訊,實現比較友好的介面顯示和操作.
什麼是NIT和EIT?
      NIT是Network Information Table的簡稱,即”網路資訊表”.
        EIT是Event Information Table的簡稱,即”環境資訊表”.
        NIT可以提供當前流的節目資訊,也可以提供和當前流有關聯的流的節目資訊.
        EIT提供的是流節目資訊的改變,比如一個節目已經開始,或者已經結束的資訊等.
什麼是EPG?
      EPG是Electronic Programme Guides的簡稱,即”電子節目指南”.該功能可實現預告近段時間即將播放的節目內容,同時支援基於內容的檢索.
什麼是teletext?
      Teletext就是我們常說的”圖文電視”,當然在MPEG-2中,圖文電視已經數字化,也就是說,圖文資訊已經做為數字化資訊在TS流中傳播.但最終,數字化的圖文資訊都將轉化為類比的VBI資訊插入到正常的電視訊號中實現圖文電視的顯示.圖文電視有很多標準,比如close caption,WSS等,歐洲的DVB使 用的teletext標準是ITU-R System B Teletext規格.該規格支援歐洲多種語言,支援簡單圖象和文本的混合顯示.

                                                                        第二章 DVB系統的構成
[本文不詳細描述DVB系統的硬體構成,只是根據ISO13818中的描述,詳細解釋TS碼流的格式和解複用原理.(夠了,夠了呵呵)]
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;
 unsigned transport_error_indicator:1;
 unsigned payload_unit_start_indicator:1;
 unsigned transport_priority:1;
 unsigned PID:13;
 unsigned transport_scrambling_control:2;
 unsigned adaptation_field_control:2;
 unsigned continuity_counter:4;
}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的時候可能是Video 1==0x100,Video 2==0x101,Audio 1==0x102,Audio 2==0x103, Audio 3==0x104,這樣傳輸的TS碼流中的PID就可能有以上的PID.因此,如果我們需要在程式中過濾出第一路Video和第二路 Audio就可以這樣處理了(虛擬碼描述):
 void Process_Packet(unsigned char*buff)
 {
  int PID=GETPID(buff);
  if(PID==0x100)
  {
   SaveToVideoBuffer(buff+4);
  }
  else if(PID==0x103)
  {
   SaveToAudioBuffer(buff+4);
  }
  else
  {
   printf("unknown PID!\n");
  }  
 }
現 在的問題是,編碼的時候分配好的PID,在解碼的時候是怎麼知道什麼PID對應什麼資料呢?這就是DVB SI表格的分析與處理了,請參考第三章.這裡先看一個實際的TS碼流的例子.這裡的資料是用UltraEdit用16進位格式開啟TS碼流檔案得到的.檔案是Taiwan-551.ts.
這裡僅僅截取了3個Packet的資訊,請注意圖中用紅色標註的部分,這就是TS流Packet的4個位元組的頭資訊.這個TS流是採用每個包共188位元組的格式,因為兩個頭資訊的間隔是188個位元組(第一個0x47到第二個0x47的間隔).以後的所有的Packet都將是188位元組的格式,這是 DVB TS標準規定的固定大小.那麼這三個包分別包含的是什麼資料,下面我們可以自己分析一下.
 先 看第一個包,頭資訊資料是"0x47 0x07 0xe5 0x12",剛才已經知道了,header資訊都是按位操作的(這就是為什麼TS碼流也可以叫做位流的原因),特別要注意的是定義和傳輸的時候都是MSB first,也就是說,先出現的位是資料的最高位.先轉化成2進位格式:
 01000111 00000111 11100101 00010010
請對照上面的PACKET_HEADER結構:
typedef struct
{
 unsigned sync_byte:8;
 unsigned transport_error_indicator:1;
 unsigned payload_unit_start_indicator:1;
 unsigned transport_priority:1;
 unsigned PID:13;
 unsigned transport_scrambling_control:2;
 unsigned adaptation_field_control:2;
 unsigned continuity_counter:4;
}PACKET_HEADER;
那麼對照一下,我們可以發現:
 sync_byte=01000111,就是0x47,這是DVB TS規定的同步位元組,固定是0x47.
 transport_error_indicator=0,表示當前包沒有發生傳輸錯誤.
 payload_unit_start_indicator=0,含義請參考ISO13818-1標準文檔
 transport_priority=0,表示當前包是低優先順序.
 PID=00111 11100101即0x07e5,這代表是什麼呢,暫時還不知道(實際上是Video PID,參考)
 transport_scrambling_control=00,表示節目沒有加密
 adaptation_field_control=01即0x01,具體含義請參考ISO13818-1
 continuity_counte=0010即0x02,表示當前傳送的相同類型的包是第3個
依此類推,再看一下第二個包"0x47 0x07 0xe5 0x13",2進位是01000111 00000111 11100101 00010011
 sync_byte=01000111,就是0x47,這是DVB TS規定的同步位元組,固定是0x47.
 transport_error_indicator=0,表示當前包沒有發生傳輸錯誤.
 payload_unit_start_indicator=0,含義請參考ISO13818-1標準文檔
 transport_priority=0,表示當前包是低優先順序.
 PID=00111 11100101即0x07e5,這代表是什麼呢,暫時還不知道(實際上是Video PID,參考)
 transport_scrambling_control=00,表示節目沒有加密
 adaptation_field_control=01即0x01,具體含義請參考ISO13818-1
 continuity_counte=0011即0x03,表示當前傳送的相同類型的包是第4個(注意到了吧,以上兩個包的PID都是0x07e5,所以這裡的continuity_counte就遞增一次)
第三個包是"0x47 0x07 0xf1 0x18",2進位是01000111 00000111 11110001 00011000.
 sync_byte=01000111,就是0x47,這是DVB TS規定的同步位元組,固定是0x47.
 transport_error_indicator=0,表示當前包沒有發生傳輸錯誤.
 payload_unit_start_indicator=0,含義請參考ISO13818-1標準文檔
 transport_priority=0,表示當前包是低優先順序.
 PID=00111 11100101即0x07f1,這代表是什麼呢,暫時還不知道(實際上是Audio PID,參考)
 transport_scrambling_control=00,表示節目沒有加密
 adaptation_field_control=01即0x01,具體含義請參考ISO13818-1
 continuity_counte=1000即0x08,表示當前傳送的相同類型的包是第9個
請看解碼程式<<Seekfor MPEG-2 decoder>>讀取該檔案的結果:
 我們可以發現,Taiwan-551.ts有一個節目叫"DIMO",它的Video PID是0x07e5,Audio PID是0x07e6
還有一個節目叫"Service 1",沒有Video PID,它的Audio PID是0x07f1(說明是一個廣播節目而非電視節目)
這個資料剛好和我們剛才的分析是吻合的.
但 是我想大家還有疑問,為什麼0x07e5代表Video PID,0x07e6代表其中一個Audio PID呢?這就是剛才提到的,這是TS流在編碼的時候就分配好了的.但是,在解碼的時候是怎麼知道0x07e5就代表的是Video而不是Audio呢?這就是第三章的內容:DVB SI/PSI分析和處理.     

                                                                       第三章 DVB SI/PSI分析和處理
SI是Specific Information的簡稱,PSI是program Specific Information.該機制允許DVB傳送各種各樣的訊息,比如節目名稱,電視台名稱,各種PID,私人資訊,甚至單獨傳送資料實現資料通訊等.這些功能的實現都歸功於SI/PSI.
 在DVB 標準中,定義了一個標準的PID用來實現SI/PSI.這些PID是系統保留的,因此DVB編碼的時候並不會用這些PID做為Video PID或者 Audio PID或者其他PID.在一個簡單的解複用程式中,只需要提供處理PAT,PMT表格的程式即可實現解複用,當然如果需要更友好的介面和實現更複雜的功能(如CA)則必須處理其他的SI表.在這裡僅僅分析PAT,PMT,SDT表格,其他SI表格的分析,請參考ISO13818-1(MPEG-2系統層標準)和EN300468(DVB SI標準)文檔.
 DVB定義的SI保留的PID分別是:
 
上表格的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)
   {
    Process_PAT(buff+4);
   }
   else if(PID==......)
   {
   }
   else
   {
    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表攜帶以下資訊:
(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表定義如下:
 各欄位含義如下:
 table_id:8 bits,標誌本表格的類型,應該是0x00
 section_syntax_indicator:1 bit,段文法標誌,應該是'1'
 '0':固定的'0',這是為了防止和ISO13818Video流格式中的控制字衝突而設定的.
 Reserved:保留的2bits,保留位一般都是'0'
 section_length:12bits的段大小,單位是Bytes.
 transport_stream_id:16bits的當前流ID,DVB內唯一.(事實上很多都是自訂的TS ID)
 version_number:5bits版本號碼,標註當前節目的版本.這是個非常有用的參數,當檢測到這個欄位改變時,說明TS流中的節目已經變化了,程式必須重新搜尋節目.
 current_next_indicator:1bit:當前還是未來使用標誌符,一般情況下為'0'
 section_number:8bits當前段號碼
 last_section_number:8bits最後段號碼(section_number和last_section_number的功能是當PAT內容>184位元組時,PAT表會分成多個段(sections),解複用程式必須在全部接收完成後再進行PAT的分析)
 從for()開始,就是描述了當前流中的頻道數目(N),每一個頻道對應的PMT PID是什麼.解複用程式需要和類似的迴圈來接收所有的頻道號碼和對應的PMT PID,並把這些資訊在緩衝區中儲存起來.在後部的處理中需要使用到PMT PID.
 CRC_32:本段的CRC校正值,一般是會忽略的.N是一個變數,計算方法是N=(section_length-9)/4.
 從以上分析我們可以發現,PAT表主要包含頻道號碼和每一個頻道對應的PMT的PID號碼,這些資訊我們在處理PAT表格的時候會儲存起來,以後會使用到這些資料.例如我們可以定義這樣的資料結構儲存這些資訊:
 typedef struct
 {
  int channel_number;
  int pmt_pid;
 }PMT_ITEM;
 PMT_ITEM pmt[64];
PMT, Program Map Table,節目影射表
 如果一個TS流中含有多個頻道,那麼就會包含多個PID不同的PMT表.檢測是否PMT的虛擬碼如下:
 void Process_Packet(unsigned char*buff)
 {
  int I;
  int PID=GETPID(buff);
  if(PID==0x0000)
  {
   Process_PAT(buff+4);
  }
  else if(PID==.....)
  {
  }
  else
  {
  
   for(i=0;i<64;i++)
   {
    if(PID==pmt[i].pmt_pid)
    {
     Process_PMT(buff+4);
     break;
    }
   }
  }
 }
PMT表中包含的資料如下:
(1) 目前通道中包含的所有Video資料的PID
(2) 目前通道中包含的所有Audio資料的PID
(3) 和目前通道關聯在一起的其他資料的PID(如數位廣播,資料通訊等使用的PID)
PMT定義如下:
 
各欄位含義如下:
 table_id:8bits的ID,應該是0x02
 section_syntax_indicator:1bit的段文法標誌,應該是'1'
 '0':固定是'0',如果不是說明資料有錯.
 reserved:2bits保留位,應該是'00'
 section_length:16bits段長度,從program_number開始,到CRC_32(包含)的位元組總數.
 program_number:16bits的頻道號碼,表示當前的PMT關聯到的頻道.換句話就是說,當前描述的是program_number頻道的資訊.
 reserved:2bits保留位,應該是'00'
 version_number:版本號碼,如果PMT內容有更新,則version_number會遞增1通知解複用程式需要重新接收節目資訊,否則version_number是固定不變的.
 current_next_indicator:當前未來標誌符,一般是0
 section_number:當前段號碼
 last_section_number:最後段號碼,含義和PAT中的對應欄位相同,請參考PAT部分.
 reserved:3bits保留位,一般是'000'.
 PCR_PID:13bits的PCR PID,具體請參考ISO13818-1,解複用程式不使用該參數.
reserved:4bits保留位,一般是'0000'
program_info_length:節目資訊長度(之後的是N個描述符結構,一般可以忽略掉,這個欄位就代表描述符總的長度,單位是Bytes)
緊接著就是頻道內部包含的節目類型和對應的PID號碼了.
stream_type:8bits流類型,標誌是Video還是Audio還是其他資料.
reserved:3 bits保留位.
elementary_PID:13bits對應的資料PID號碼(如果stream_type是Video,那麼這個PID就是Video PID,如果stream_type標誌是Audio,那麼這個PID就是Audio PID)
reserved:4 bits保留位.
ES_info_length:和program_info_length類似的資訊長度(其後是N2個描述符號)
CRC_32:32bits段末尾是本段的CRC校正值,一般忽略.
從以上的分析可以看出,只要我們處理了PMT,那麼我們就可以擷取頻道中所有的PID資訊,例如目前通道包含多少個Video,共多少個Audio,和其他資料,還能知道每種資料對應的PID分別是什麼.
這樣如果我們要選擇其中一個Video和Audio收看,那麼只需要把要收看的節目的Video PID和Audio PID儲存起來,在處理Packet的時候進行過濾即可實現.
比較全面實現解複用的虛擬碼如下:
int Video_PID=0x07e5,Audio_PID=0x07e6;
void Process_Packet(unsigned char*buff)
{
 int I;
 int PID=GETPID(buff);
 if(PID==0x0000)
 {
  Process_PAT(buff+4);
 }
 else if(PID==Video_PID)
 {
  SaveToVideoBuffer(buff+4);
 }
 else if(PID==Audio_PID)
 {
  SaveToAudioBuffer(buff+4);
 }
 else
{
 for( i=0;i<64;i++)
 {
  if(PID==pmt[i].pmt_pid)
  {
   Process_PMT(buff+4);
   Break;
  }
 }
}
 }
以上虛擬碼可以實現基本的解複用:檢測所有的頻道,檢測所有stream的PID,選擇特定的節目進行播放.只要讀取每個Packet的188位元組的內容,然後每次都調用Process_Packet()即可實現簡單的解複用.
介紹到這裡,我們就可以總結一下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 section,服務描述段
 SDT可以提供的資訊包括:
(1) 該節目是否在播放中
(2) 該節目是否被加密
(3) 該節目的名稱
SDT定義如下:
 
各欄位定義如下:
 table_id:8bits的ID,可以是0x42,表示描述的是當前流的資訊,也可以是0x46,表示是其他流的資訊(EPG使用此參數)
 section_syntax_indicator:段文法標誌,一般是'1'
 reserved_future_used:2bits保留未來使用
 reserved:1bit保留位,防止控制字衝突,一般是'0',也有可能是'1'
 section_length:12bits的段長度,單位是Bytes,從transport_stream_id開始,到CRC_32結束(包含)
 transport_stream_id:16bits當前描述的流ID
 reserved:2bits保留位
 version_number:5bits的版本號碼,如果資料更新則此欄位遞增1
 current_next_indicator:當前未來標誌,一般是'0',表示當前馬上使用.
 original_netword_id:16bits的原始網路ID號
 reserved_future_use:8bits保留未來使用位
 接下來是N個節目資訊的迴圈:
  service_id:16 bits的伺服器ID,實際上就是PMT段中的program_number.
  reserved_future_used:6bits保留未來使用位
  EIT_schedule_flag:1bit的EIT資訊,1表示當前流實現了該節目的EIT傳送
  EIT_present_following_flag:1bits的EIT資訊,1表示當前流實現了該節目的EIT傳送
  running_status:3bits的運行狀態資訊:1-還未播放 2-幾分鐘後馬上開始,3-被暫停播出,4-現正播放,其他---保留
  free_CA_mode:1bits的加密資訊,'1'表示該節目被加密.
  緊 接著的是描述符,一般是Service descriptor,分析此描述符可以擷取servive_id指定的節目的節目名稱.具體格式請參考 EN300468中的Service descriptor部分.分析完畢,則節目名稱和節目號碼已經聯絡起來了.機頂盒程式就可以用這些節目名稱代替 PID讓使用者選擇,從而實現比較友好的使用者介面!

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.