青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

elva

精解PSI-SI(二)

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- 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讓用戶選擇,從而實現比較友好的用戶界面!

 下面參考一下<<Seekfor MPEG2 decoder>>中的界面和顯示信息.

 

上 圖是<<Seekfor MPEG2 decoder>>打開三個不同的碼流文件(*.ts)形成的PID信息和節目名稱.用戶 可以通過切換節目名稱的下拉列表框切換節目,也可以通過"視頻流"和"音頻流"下拉列表框切換Video和Audio!這些數據都是通過分析PAT, PMT和SDT得到的.

posted on 2008-11-12 17:51 葉子 閱讀(1583) 評論(0)  編輯 收藏 引用 所屬分類: MPEG

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产综合久久久久影院| 久久在线播放| 国产精品国产三级国产专播精品人| 日韩性生活视频| 一区二区三区国产精华| 国产精品男女猛烈高潮激情| 欧美一区二区三区精品| 久久久久久久久久久久久9999| 国产欧美一区二区三区国产幕精品| 久久国产精品黑丝| 久久久久9999亚洲精品| 亚洲免费av电影| 亚洲影院色无极综合| 国模精品一区二区三区| 亚洲国产成人精品久久| 老司机久久99久久精品播放免费| 亚洲美女毛片| 亚洲欧美一区二区在线观看| 亚洲第一福利在线观看| 日韩视频二区| 好看的日韩视频| 亚洲精品久久久久中文字幕欢迎你 | 久久国内精品自在自线400部| 一区视频在线| 99re66热这里只有精品3直播| 国产伦一区二区三区色一情| 免费成人在线观看视频| 欧美视频导航| 免费成人av在线看| 国产精品久久网站| 亚洲国产成人久久综合| 国产精品一区二区在线| 亚洲第一区中文99精品| 国产欧美日韩高清| 亚洲精品一区二区三区在线观看| 国产亚洲a∨片在线观看| 亚洲精选大片| 亚洲国产精品一区制服丝袜| 亚洲一二三四久久| 日韩网站在线观看| 久久精品午夜| 久久国产精品99久久久久久老狼| 欧美日韩大片| 亚洲国产日韩综合一区| 国产午夜久久久久| 亚洲小视频在线观看| 99热免费精品| 欧美**字幕| 欧美成人日本| 樱花yy私人影院亚洲| 欧美一区二区三区在线视频| 国产一区二区三区的电影| 亚洲欧洲日产国码二区| 伊人久久婷婷色综合98网| 亚洲欧美中文另类| 亚洲视频自拍偷拍| 欧美精品一区二| 亚洲第一页自拍| 亚洲高清不卡一区| 久久一区二区三区四区| 久久一本综合频道| 国内精品久久久久久| 欧美有码视频| 久久综合影视| 在线精品一区| 免费观看成人| 亚洲国产精品久久91精品| 亚洲国产经典视频| 男人的天堂亚洲| 亚洲国产精品99久久久久久久久| 亚洲国产综合91精品麻豆| 麻豆乱码国产一区二区三区| 欧美高清视频在线播放| 亚洲精品国产精品国自产在线 | 欧美精品免费播放| 亚洲精选在线| 午夜精品一区二区三区四区| 国产精品区免费视频| 亚洲欧美中文在线视频| 久久久99精品免费观看不卡| 悠悠资源网久久精品| 欧美第十八页| 亚洲一区免费在线观看| 欧美在线观看一区二区| 在线观看国产精品淫| 欧美超级免费视 在线| av成人免费在线观看| 欧美在线视频免费播放| 亚洲成人影音| 欧美视频一区二区三区在线观看| 亚洲欧美久久久| 欧美成人午夜| 亚洲欧美视频在线| 伊人久久成人| 欧美性猛交xxxx乱大交退制版 | 久久夜色精品亚洲噜噜国产mv| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美三级资源在线| 久久aⅴ国产欧美74aaa| 亚洲激情六月丁香| 欧美一级网站| aaa亚洲精品一二三区| 国产一区二区毛片| 欧美精品一区二区三区视频| 欧美一级免费视频| 亚洲国产精品黑人久久久| 久久成人精品电影| av成人免费在线| 好看的av在线不卡观看| 国产精品久久久久一区二区三区共| 久久久久久色| 亚洲欧美另类久久久精品2019| 亚洲国产精品久久| 久久一区中文字幕| 亚洲欧美卡通另类91av| 亚洲精品一区在线观看| 激情综合色综合久久综合| 国产精品二区在线| 亚洲福利视频一区二区| 在线成人亚洲| 国产精品天天摸av网| 欧美精品1区2区| 久久婷婷成人综合色| 午夜精品视频在线观看| 99精品久久免费看蜜臀剧情介绍| 欧美福利一区二区三区| 久久一区二区三区国产精品 | 久久久久久网址| 亚洲一区二区伦理| 一本一本久久a久久精品牛牛影视| 韩日精品视频| 狠狠爱综合网| 国产在线不卡精品| 国产视频一区在线| 国产精品一区毛片| 国产精品婷婷午夜在线观看| 国产精品户外野外| 欧美性事在线| 国产精品久久精品日日| 国产精品久久97| 国产精品久久久久久久第一福利 | 欧美成人在线网站| 女同性一区二区三区人了人一 | 欧美一区成人| 欧美制服第一页| 久久久久久一区| 久久婷婷综合激情| 欧美fxxxxxx另类| 欧美国产大片| 欧美日韩福利视频| 欧美三级电影网| 国产精品呻吟| 精品av久久久久电影| 亚洲成人在线视频网站| 亚洲国产精品久久久久婷婷884 | 亚洲日本va午夜在线电影| 亚洲精品少妇| 亚洲图片自拍偷拍| 香蕉久久夜色| 久久一区中文字幕| 亚洲国产高清自拍| 夜夜嗨av色一区二区不卡| 亚洲欧美激情四射在线日 | 在线观看视频亚洲| 亚洲精品一区在线观看香蕉| 亚洲视频免费看| 久久gogo国模裸体人体| 你懂的国产精品| 日韩视频一区二区三区在线播放免费观看 | 欧美成人午夜影院| 亚洲精品网站在线播放gif| 亚洲视频一区二区在线观看| 午夜日韩在线| 欧美激情一区二区在线| 国产精品久久久久久久久久久久久久| 国产区亚洲区欧美区| 亚洲国产一区二区视频| 性做久久久久久免费观看欧美 | 亚洲美女av网站| 国产无一区二区| 亚洲精品久久久久中文字幕欢迎你 | 欧美黄色网络| 国产亚洲精品一区二区| 日韩午夜一区| 久久综合99re88久久爱| 99亚洲一区二区| 久久青青草综合| 国产精品美女久久久| 亚洲国产精品久久久久婷婷老年 | 亚洲免费视频观看| 欧美1区2区3区| 亚洲欧美久久久| 欧美日韩国产小视频在线观看| 国产一区二区三区av电影| 亚洲一区二区在线观看视频| 蜜臀va亚洲va欧美va天堂| 亚洲欧美日韩精品一区二区| 欧美另类视频在线| 亚洲国产高清aⅴ视频| 欧美在线看片a免费观看|