如何在STB上實現EPG?

來源:互聯網
上載者:User

一、 輸入頻率、符號率、調製方式鎖定頻道。
二、 接收目前通道上的PAT表,已知條件是PAT的PID固定為0,將PAT表解析儲存。
三、 從PAT中取得NIT表的PID:
方法是:當program_number=0時,取得network_pid。當然將NIT表的PID固定認為是0x0010也是一種解決方案,但這種解決方案不是最基本的方式。
說明:如果從PAT表中找不到NIT的PID,則將NIT的PID預設為0x0010。
四、 根據NIT表的PID取得NIT表,解析並儲存。
五、 從NIT表中的第一個descriptor()中取得network_name_descriptor可以得到網路名稱,這個一般描述的是網路電訊廠商的名稱,可以在螢幕上顯示,根據需要顯示,不是必須的
六、 從NIT表中的第二個descriptor()迴圈中取得當前網路所管理的頻道資源資訊表cable_delivery_system_descriptor(),從中可以得到所有幾個頻道的關鍵字段值frequency(頻率),modulation(調製方式),symbol_rate(符號率)。至此,網路資訊資源已全部獲得,這是非常關鍵的一步。
七、 根據上述網路資訊,建上一個迴圈,分別各自鎖定不同的頻道。
八、 在鎖定的頻道下,接收當前PAT表(PID=0)。通過分析program_number欄位就可以知道在目前通道上共播放了多少個節目(服務),記錄下每個服務的PMT表,解析並儲存。
九、 通過一個PMT表的PID就可以接收這個節目的PMT表,解析並儲存。
十、 在PMT表中取得以下幾個關鍵字段:PCR_PID,分別取得流類型欄位stream_type各自對應的流的基本PID(elementary_PID),如:當stream_type=0x02時,表示是視頻流,那麼此時,elementary_PID代表Video_PID,當stream_type=0x04時,表示是音頻流,此時,elementary_PID代表Audio_PID.。
這裡要著重注意:一個視頻配套多個音頻PID的情況。說明:到了這一步就可以實現一個節目的播放了。特別申明:在PMT表的第一個descriptor()迴圈中要檢測是否有CA_descriptor()描述,如果有,則取出其中的CA_system_ID和CA_PID。通過這兩個PID可以取得關於CA更詳細的資訊,關於CA這裡不做更詳細的解釋和描述。
十一、接收SDT表,PID固定為0x0011,注意:由於SDT和BAT的PID完全一致,因此要通過table_id來區分,其中(table_id=0x4A表示是BAT表)table_id=0x42表示是當前服務描述SDT表,解析並儲存。
說明:table_id=0x46表示是其他頻道上的服務描述SDT表
十二、通過service_id(對應PMT表中的program_number)找到各自服務的名稱(節目名,如:CCTV-1等)。在SDT表中的service_id中找到service_descriptor(),從中可以取得service_name(如:CCTV-1等)。
注意:這裡free_CA_mode不能做為節目是否加密的判斷標誌,因為在有些加擾器裡,並沒有對該欄位進行修改,比如barco的加擾器就是如此。還要注意兩個特殊欄位:EIT_schedule_flag,該值為1時,表示在目前通道上出現了時間表(用於報告一個服務裡所包含的一天甚至一個月的節目預告)。當EIT_present_following_flag=1時,表示在目前通道上出現了出現/跟隨事件資訊表(當前時刻/下一時刻的資訊)。
十三、從第八步迴圈,完成的有節目資訊的收集:
說明:至此,除了節目時間、內容資訊沒有收集外,其餘的節目資訊已收集完畢,包括以下內容:
1、 共多少個頻道。
2、 每個頻道下有多少套可供播放的節目。
3、 每個節目的名稱,相關PCR_PID,V_PID,A_PID等。
根據以上資訊可以組織菜單,實現節目的播放了。
注意:要取得多語種描述的節目名稱,可以從SDT表中的country_availability_descriptor()欄位為:country_code=”CHN”代表中文,”ENG代表英文等”,但是要知道country_availability_descriptor()不是一定會播發的,也就是說這個表可能不存在。


節目內容和時間資訊如何擷取
一、 接收TDT表
TDT表的PID固定為0x0014,在所有的頻道上都有,欄位為OTC_time,比如:0xc079124500代表:1993/10/13,12:45:00,取得該時間後,就由STB的定時器自動去計算以後的時間了。
二、 接收EIT表:
在任一頻道上可以取得全網的所有的EIT表,EIT表的PID固定為0x0012
當table_id=0x4e時,表示的是目前通道上實際的出現/跟隨事件資訊
當table_id=0x4f時,表示的是其它頻道上的出現/跟隨事件資訊
當table_id=0x50-0x5f時,表示的是目前通道上的節目時間表
當table_id=0x60-0x6f時,表示的是其它頻道上的節目時間表

當table_id=0x4e或0x4f時,如何區分當前出現時間和跟隨時間呢?通過section_number 來區分,當section_number= 0x00時表示是當前時刻,當section_number=0x01時,表示的是下一時刻。在EIT表中有幾個非常關鍵的欄位,一個是transport_stream_id表示頻道,與SDT表中的對應,service_id表示服務號(節目號),同時與PMT表中的program_number對應,如何擷取一個節目的事件資訊呢?
首先定位頻道:transport_stream_id,在該頻道下找到要檢測的節目service_id
當table_id=0x4e時,表示是目前通道,如果現在手中已有的目前通道的transport_stream_id和在此條件下EIT表中的transport_stream_id能對應上的話,說明正確。
接下來,取得當前資訊。方法是判斷section_number=0x00的段確定後找到start_time,該事件的開始時間,duration期間,duration+start_time就是該事件(節目)的結束時間。通過descriptor()中的short_event_descriptor()可以取得多語種的節目名和節目簡介資訊,關鍵同為ISO_639_language_code(比如:“CHN”),event_name_char(比如:“新聞聯播”),text_char(節目簡介)。
在數字電視中簡介部分暫可以不取(text_char)。

注意:當table_id=”0x4e”或”0x4f”時,for(;;)裡面描述的事件只有一個。只有當table_id=0x50-0x5f或0x60-0x6f時才能出現多個。同樣,取下一時刻資訊時,要判斷的條件為section_number=0x01。
這裡有一個特殊的情況需要處理,那就是當running_status=0時,表示的是NVOD的參考事件描述,duration、start_time、event_name_char、text_char不屬於DTV的EPG範疇,遇到這種情況需要屏蔽掉。
通過以上條件的迴圈,在一個物理頻道上,可以取得所有的節目時間表和內容,包括一天或一周、一月、二個月的節目預告。至此,可以形成完整的EPG。

需要注意的事項:
1、 當接收到一個表後,一定要將version_number儲存下來,當第二次接收這個表時,如果發現version_number發生了變化,則一定要開始重新接收所有相關聯的表。
2、 還有一個可選機制,那就是接收RST表,該表用於描述EIT表的狀態變化。RST表的播發不是必須的,不能作為EIT表接收的必要條件。

聯繫我們

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