葛 倩,于鴻洋,張 萍
(電子科技大學 電子工程學院,四川 成都 611731)
在數(shù)字電視廣播系統(tǒng)中,在TS(Transport Stream)傳輸流最終被送到信道設備進行信道發(fā)送之前,TS流復用器將不同來源的傳輸流合并為一個新的傳輸流。電子節(jié)目指南(Electronic Program Guide,EPG)是指在符合MPEG-2(13818-1)的TS傳輸流中插入DVB標準定義的業(yè)務信息(Service Information,SI),是一種收視導航工具,是交互電視的關鍵技術。EPG協(xié)助觀看電視節(jié)目的用戶選擇節(jié)目,用戶通過EPG可以得到節(jié)目的相關信息。
復用時,EPG等其他服務信息要通過復用器插入到TS流中。由于輸入到復用器的各TS流的EPG信息可能不完整或需要在原TS流中插播節(jié)目,所以復用之前需對各個待復用TS流的EPG信息進行添加或修改。同時,復用器會對節(jié)目號等信息重新賦值,攜帶EPG信息的各個表也要根據(jù)復用器的修改情況進行相應的修改和合并。EPG的處理在TS復用中非常重要,筆者介紹了一種TS流復用器中EPG信息相關表的處理方法。
EPG信息由兩部分信息組成:基本EPG信息和擴展EPG信息?;綞PG信息是指完全可以用《數(shù)字廣播業(yè)務信息規(guī)范(GY/Z174-2001)》中的網(wǎng)絡信息表(NIT)、業(yè)務群關聯(lián)表(BAT)(可選)、業(yè)務描述表(SDT)和事件信息表(EIT)進行描述的EPG信息[1-3]。筆者主要介紹基本EPG的處理,包括對NIT,SDT和EIT的處理,BAT的處理方式與其他表相似。
筆者設計基于IP多路輸入、多路復用輸出的TS軟件復用器中的EPG處理部分,復用器與設計均在Linux系統(tǒng)下實現(xiàn)。整個設計主要可分為EPG獲取、EPG數(shù)據(jù)存儲編輯、EPG發(fā)生等模塊,系統(tǒng)框圖如圖1所示。
圖1 系統(tǒng)框圖
EPG獲取模塊主要完成對EPG信息的接收提取與分析。之后由EPG數(shù)據(jù)存儲編輯模塊將得到的信息存入數(shù)據(jù)庫MySQL,并由用戶進行導入或編輯操作,對EPG進行相應的添加或修改,最后EPG發(fā)生模塊根據(jù)數(shù)據(jù)庫中存儲的新EPG信息和復用信息,產(chǎn)生新的EPG數(shù)據(jù),按一定的時間間隔插入到輸出TS流中。筆者將通過對各模塊的實現(xiàn)方法介紹來論述TS流復用器中EPG信息處理的實現(xiàn)。
為了提高EPG的接收效率,對EPG獲取的兩個處理過程進行了優(yōu)化,即各表section接收和接收信息完整性的判斷。
1)section接收優(yōu)化
部分機頂盒由于處理器主頻和存儲空間的限制,在接收PSI/SI表的section時采用PAT→NIT→SDT→EIT順序接收的方法,即在一個時間段內(nèi)只對一種PSI/SI表進行接收。會出現(xiàn)接收到SDT或EIT的包時,因為PAT或NIT沒有接收完成或者丟包而放棄接收分析的情況,當需要接收這些表時又要等到下一個發(fā)送周期,這樣接收完所有的表可能需要幾個發(fā)送周期,接收效率較低。由于系統(tǒng)在PC上實現(xiàn),存儲空間和處理器主頻的限制較小,故對接收方式進行了優(yōu)化,采用并行接收,即先接收PAT,之后并行接收NIT,SDT和EIT,可以節(jié)省時間。并行接收主要體現(xiàn)在section的接收處理上,接收步驟為:
(1) 過濾 PID=0x000的包,分析PAT,獲得 NIT的PID、該流的節(jié)目數(shù)量以及所有節(jié)目的節(jié)目號,存入節(jié)目數(shù)據(jù)鏈表。由于PAT發(fā)送周期較短(為40ms),這一步驟可在很短的時間內(nèi)完成。
(2)對其余3種表的section進行并行接收。程序根據(jù)TS包的PID過濾出需要的包,分別送入NIT,SDT和EIT各自的接收通道中,每個通道利用獨立的數(shù)據(jù)結(jié)構來記錄section接收情況信息和獨立的存儲空間,存儲接收到的section內(nèi)容,使得各通道互不干擾。
(3)section進入各自的接收通道后,先判斷是否丟包,之后對TS包解包,將section內(nèi)容存入緩沖,根據(jù)section_length來判斷一個section是否接收完成,如果完成,按照各表的結(jié)構,分析該section,存儲相關信息,最后判斷接收信息的完整性,決定是否繼續(xù)接收。
2)判斷信息完整性優(yōu)化
在判斷接收信息的完整性時,不采用以往一些設計中根據(jù)last_section_number來判斷的方法,這要求section以section_number的順序依次接收,若開始接收時錯過section_number為0的包或者丟包,則導致之后section_number的包需等到下一發(fā)送周期才能接收,降低了接收效率,PSI/SI發(fā)送周期較長或者網(wǎng)絡質(zhì)量較差時影響尤為嚴重。
筆者采用一種改進的接收判斷方法,可以解決這個問題,即利用段存在標志數(shù)組來判斷信息完整性,不要求按照section_number順序接收。具體實現(xiàn)為:程序首次收到該表section時,通過last_section_number(EIT還需要segment_last_section_number和last_table_id以及本TS流中的節(jié)目數(shù)和節(jié)目的program_number)計算出該表的section總數(shù)和所有section_number,以此建立section存在標志數(shù)組。以SDT為例,若得到last_section_number為1,則可以計算出該流SDT分段有2個section,section_number分別為0和1,即可建立標志數(shù)組,把0和1的位置置位為存在。之后每接收完一個section,把對應標志數(shù)組中的該section標志置位為已接收,并檢查所有的存在標志,若有存在標志未置位為已接收,則繼續(xù)接收該表,否則該表接收完成,停止接收。
3)優(yōu)化結(jié)果
優(yōu)化以存儲空間為代價來提高接收效率,適合于在存儲空間限制較小的PC上實現(xiàn)。若不經(jīng)優(yōu)化,系統(tǒng)可能需要接收端接收到數(shù)次完整的信息才能完成接收,而優(yōu)化之后的系統(tǒng)接收端只須收到一次完整的信息,就可以完成接收,減小了PSI/SI發(fā)送周期和丟包的影響。
系統(tǒng)對各表采用介紹的優(yōu)化方法進行并行接收,完成EPG信息的分析存儲,接收框圖如圖2所示。
EPG相關表格接收完畢后,形成數(shù)據(jù)鏈表,結(jié)構如圖3所示。
這樣的結(jié)構可以通過輸入TS流標號和節(jié)目號迅速定位節(jié)目信息,使之在鏈表中的添加刪除靈活簡便,也便于之后的表生成模塊的處理。
選用的數(shù)據(jù)庫為MySQL。MySQL是一個開放源碼的關系數(shù)據(jù)庫管理系統(tǒng),支持Linux操作系統(tǒng),CPU利用率高,查詢速度快,還提供多種語言支持,滿足EPG信息的多語言要求。基于這些特性,MySQL可以滿足設計中對EPG處理的要求。
所有的EPG信息存入創(chuàng)建的database中,程序根據(jù)輸入TS流的EPG建立table:SDT,EIT_PF和EIT_schedule_stream.No_prog_program.No,存入相關信息。
用戶通過EPG編輯器對EPG信息進行編輯。其功能模塊包括網(wǎng)絡配置和事件編輯(包括節(jié)目編輯和節(jié)目單導入導出),完成后,將修改的信息導入數(shù)據(jù)庫。
圖3 EPG信息數(shù)據(jù)鏈表
為了便于表的生成,為各輸出流建立一個數(shù)據(jù)結(jié)構數(shù)組mult_infomation,存儲該流的復用信息,其中包含了stream_id(輸入 TS 流標號),origin_program_number(該節(jié)目的原始節(jié)目號),new_program_number(在復用流中的節(jié)目號)等信息,數(shù)組的項數(shù)為該復用流中所包含的節(jié)目數(shù),通過該數(shù)據(jù)結(jié)構可以方便地得到節(jié)目被復用到輸出流中的位置。
NIT,SDT和EIT在TS流中的獨立性各不相同,所以section生成方式稍有不同。NIT對網(wǎng)絡信息進行描述,在同一網(wǎng)絡中,所有流的NIT是相同的,只須生成一種NIT section之后進行打包,作為同一網(wǎng)絡中所有流的NIT包,對于SDT,每個流的SDT section各不相同,需對各輸出流生成各自的SDT section,之后再打包,EIT是以節(jié)目為單位獨立的,即相同節(jié)目的EIT section除了service_id,其余部分在各TS流中都是相同的,所以先對各輸入TS流的各節(jié)目生成EIT section,之后輸出流根據(jù)mult_infomation從這些EIT section中選出需要的section,修改service_id,進行打包。
生成section的信息從數(shù)據(jù)庫中讀取,之后根據(jù)各表的結(jié)構建立section,完成后計算CRC并插入。輸出TS流還需帶有同一網(wǎng)絡中其他TS流的SDT和EIT信息,傳輸這些信息需修改 table_id(SDT改為 0x4F,EIT在原table_id上加上0x10)和重新計算CRC。
SDT和EIT作為其他流信息發(fā)送時只須改變table_id和CRC,所以同一網(wǎng)絡TS流中的SDT和EIT除table_id和CRC部分不同之外,其余部分完全相同,同時,一個網(wǎng)絡中所有流共用一個NIT。由于設計的復用器輸出流均在同一網(wǎng)絡中,故各表可分別僅用一個TS包鏈表和相應的修改信息構成網(wǎng)絡中所有輸出流的待發(fā)送包。
為了建立鏈表,須對生成的section打包并存儲到TS包數(shù)據(jù)結(jié)構中,該數(shù)據(jù)結(jié)構除了有TS包的完整內(nèi)容之外,還帶有output_id(輸出流編號)和需要替換的內(nèi)容(table_id和CRC)。建立好的鏈表如圖4所示(以SDT為例),其中NEXT_SDT_USE[output_id]為指向TS包數(shù)據(jù)結(jié)構的指針,每個輸出流均有1個,用于在發(fā)送TS包時指示當前應發(fā)送的包,header_n和rear_n為指向輸出流n的本流SDT包鏈表的頭和尾。
圖4 TS包鏈表結(jié)構
對于每一個輸出流,需發(fā)送的表為:網(wǎng)絡NIT、流SDT和EIT、同一網(wǎng)絡中其他流SDT和EIT分段。DVB關于SI表的傳輸間隔要求如表1[4]所示。
表1 DVB關于SI表的傳輸間隔
以SDT發(fā)送為例,每隔2 s發(fā)送一次本流SDT分段,每隔10 s發(fā)送一次本流和其他流SDT分段,每發(fā)送一個包,NEXT_SDT_USE[output_id]就指向下一個包,當發(fā)現(xiàn)發(fā)送完成標志(僅發(fā)送當前流分段時標志為rear_n,發(fā)送所有分段時標志為header_n)即停止發(fā)送,等待下一發(fā)送周期,EIT和NIT的發(fā)送與此類似。當TS包作為其他流分段 (根據(jù)結(jié)構體中output_id和當前輸出流id判斷)發(fā)送時,須根據(jù)結(jié)構體中的修改信息進行修改。
EPG更新可以采用兩種方式:僅允許用戶手動更新和根據(jù)輸入TS流更新。更新方式的選擇以輸入TS流為單位。
1)用戶手動更新。在復用過程中,用戶通過EPG編輯器更新EPG信息,導入數(shù)據(jù)庫,程序根據(jù)數(shù)據(jù)庫中的信息重新生成表,并使表的version_number加1,完成更新。
2)根據(jù)輸入TS流更新。開始復用后,程序監(jiān)視各種表的version_number,若發(fā)現(xiàn)版本號變化,進行相關表的重新接收存儲,按照復用信息mult_infomation確定應該重建哪些表,同樣,使表的version_number加1。更新原則為[5]:
(1)若NIT變更,重新建立整個網(wǎng)絡的傳輸流和業(yè)務信息。
(2)若SDT變更,重新建立對應傳輸流里的業(yè)務信息。
(3)若EIT變更,不改變整個網(wǎng)絡的傳輸流和業(yè)務信息,只改變相應的事件信息。
TS流復用器的EPG處理系統(tǒng)工作于Linux系統(tǒng)下,完成復用器中EPG信息的添加、刪除等處理,進行測試,結(jié)果與分析如表2所示。
表2 系統(tǒng)EPG接收效率測試結(jié)果
測試中的丟包由隨機刪去發(fā)送流PSI/SI包來模擬,丟包程度為能夠保證接收端在1min內(nèi)收到一次完整的信息,接收超時時間設為1 min,若在網(wǎng)絡環(huán)境較差的情況下,可適當增加接收超時時間,以保證獲取完整的信息。在不丟包的情況下,理論上,對于TS1和TS2,優(yōu)化后的接收方式需要的最長時間分別為5 s和30 s。由表2的測試結(jié)果可以看到,優(yōu)化后的接收方式所用的時間小于未優(yōu)化的接收方式,并且丟包對優(yōu)化后的接收方式影響較小,對于沒有優(yōu)化的接收方式,丟包的影響在發(fā)送周期較長的分段時尤為嚴重。
之后對EPG信息通過EPG編輯器進行修改,輸出流經(jīng)EPG分析軟件分析,各表均正常。EPG編輯器界面如圖5所示。
圖6和圖7分別為輸入輸出流的EPG在數(shù)據(jù)庫中的情況 (系統(tǒng)對復用輸出流再次進行接收可分析得到輸出流的EPG情況),右半部分為數(shù)據(jù)庫中的table,左半部分為SDT內(nèi)容。輸入為2個TS流,第1個流沒有EPG信息,SDT中的provide_name和program_name默認為節(jié)目號。經(jīng)EPG編輯后輸出,輸出為1個流,第1個流選取節(jié)目號為ec1的流,第2個流選取所有節(jié)目,可以看到,節(jié)目號均重新賦值,并且對ec1節(jié)目的SDT進行了添加。
[1]王大鵬.電子節(jié)目指南(EPG)在機頂盒中的實現(xiàn)[C]//國際有線電視技術研討會論文集,2003.杭州:中國廣播電視協(xié)會技術工作委員會,2003:406-410.
[2]ISO/IEC 13818-1,Third edition 2007.10 information technologygeneric coding ofmoving pictures and associated audio information:system[S].2007.
[3]方濤.數(shù)字電視業(yè)務信息及其編碼[M].北京:國防工業(yè)出版社,2003.
[4]Guidelines on implementation and usage of service information[EB/OL].[2010-04-13].http://www.bjpace.com.cn/data/tec/tec-DVB/DVB-20BlueBooks-20Standards/Specifications-20and-20Standards/multiplexing/dvb-si/a005r1.pdf.
[5]陳德林.EPG前端SI發(fā)表和機頂盒終端收表策略[J].廣播與電視技術,2005(8):99-101.