看電視麻,必須有節目才行。節目從哪裏來?天然要搜索才行。咱們就來介紹一下搜索功能如何實現。前端
一,搜索所須要的硬件網絡
1,固然是tuner,就是咱們俗稱的高頻頭,由於節目都是由信道中的一個一個頻點所承載的,咱們要獲得頻點裏的電信號,這個部件天然是不可缺乏的。oop
for example,咱們要看ccav-1,假定這個節目在256Mhz頻點上,咱們必須先鎖定這個頻點,而後進行解調,找到這個頻率裏面的信息,才能找到節目。ui
2,QAM(Quadrature Amplitude Modulation),調制解調器。上一步咱們獲得了電信號,由於傳輸的過程當中有各類干擾,好比咱們要播發mpeg2的視頻,是不能直接把01010的二進制串直接播發的,那樣的話,幾米以後,信號就被各類噪聲弄成了不可識別的東東。因此咱們要把01010這種東西加上各類糾錯碼,變成各類正弦信號。在前端,咱們調製完了,固然在終端咱們必須把這01010這種恢復出來。這個工做就是QAM來作的。dvb的標準裏面有16/32/64/128/256-QAM這些標準,具體請看一下通訊原理了,呵呵。加密
ps:一般tuner是外置,而qam被集成進soc中,這是爲何呢?由於高頻是模擬的,而qam過程,實際是數字的。出於工藝,成本,集成度諸多考慮,模擬電路通常會獨立出來,soc中一般只有數字電路。視頻
3.Demux,解複用器。上一步咱們獲得了01010的二進制串,可是這個串一般是幾路節目經過必定的規則混合在一塊兒的。咱們看節目,一個時間點,一般只看一個節目,因此咱們要先從幾路節目中,獲得咱們須要的那一路,這就是demux的做用。blog
固然有些同窗說,爲何要搞這麼複雜,一個頻點上一路節目不就好了嘛。固然,這樣作絕對ok,實際上模擬電視就是這麼幹的,可是信道里面的頻點是有數的,若是不壓榨每一點資源,怎麼能在有限的資源多作一些事呢?這實際就是數字電視的優點嘛,能夠多看不少節目。呵呵。事件
二,搜索一個頻點節目的過程。資源
上一段咱們解釋了須要的硬件,提到了節目是經過必定的規則混合的(這個過程其實就叫複用)。下面咱們說說這個規則是啥。也就是搜索一個頻點節目的方法。get
概述:
ISO13818-1 system這個spec裏面描述了這個規則。不過實際上說白了,也很簡單。先說大概步驟,而後詳細,說下。
1.鎖定xxx頻率
2.從qam中獲得TS流
3.對demux設置參數,具體就是pid(package id),tid(table id), mask這些,獲得PAT表(節目關聯表)。
4.從PAT中獲得各個PMT的信息
5.解析PMT,獲得該PMT的音視頻id,加密信息。
具體流程以下圖所示。
經歷這五步曲,咱們就搜索完成了一路節目,剩下的就是批量完成這個事件了。
前兩步,就很少作介紹了,這不是ts流的業務範圍。咱們先來介紹一下TS流的概念(transport stream)。簡單來講,TS就是一個包裝網絡信息,節目信息,音頻數據,解密數據等等的容器。所謂的節目信息,就是指PSI,這個是咱們搜索所關注的。
TS每個包是188字節,連續的包,就構成了咱們節目流。每一個包都有對應的PID,這個PID就是咱們解複用的依據。PID在哪呢?一個ts包,有一個4bytes的包頭,這個4bytes包頭中,有一個13bits的字段,就是ts包對應的pid。這個pid就是這188bytes的第二bytes的後五位,與第三bytes的所有。以下圖所示。
一行代碼表示就是 uint16_t pid = ((uint16_t(buf[1] & 0x1F) << 8 ) | buf[2];
爲何有了PID,還要再加一個TID呢?由於13818裏面規定的不一樣的表,也有可能使用相同的PID,好比NIT與ST,這時咱們要區分他們,就須要Table ID了。
咱們要先找PAT,PAT是一切表的始祖,因此PID是固定的0x0000,TID是0x00。咱們找到當前流裏面全部的PAT的section。按照spec解析,大體的表結構以下圖所示,裏面的programs loop描述了各個PMT的PID。
對於PAT來講,第一個program_number是0x0000,這個其實對應的不是PMT,而是NIT的PID,下面咱們會介紹NIT搜索方式,這裏先不解釋。
有了PMT的pid,剩下的就是解析PMT裏面的音視頻的streams loop從而獲得音視頻PID,就完成一路節目的搜索。PMT的表結構以下圖
完成一路節目,再設置下一路PMT的PID,TID,循環,就完成了一個單頻點的搜索。
三,搜索整個網絡節目的方法
咱們獲得一個頻點全部節目後,剩下的任務就是如何完整的搜索整個網絡的節目了。固然,咱們必需要知道當前網絡一共有哪些頻點是可用的。通常來講,有三種方式。
1.NIT
NIT這個表,描述了當前網絡的全部信息,好比頻點,波特率,調製方式,pmt信息等等。好比下面這個nit,就有兩個section組成,每一個section中描述了當前網絡裏面節目的信息。這個網絡裏面有25個頻點,就有25個transport_streamsloop.
下面咱們看一下transport stream loop裏的信息
每個serviceid就表明了一個節目。
其實NIT搜索,就是所謂的快速搜索功能。對於運營商來講,一般不會在所在的頻點都加入nit,由於nit數據量相對比較大,都加入這個表,太浪費帶寬資源,因此對於運營商來講,一般都有一個所謂的「主頻點」,固然是人爲規定的,這個頻點裏一般會包含的信息比較全,其餘頻點的就不必定會有nit了,從這角度來講,nit是可選的。
固然,NIT不止搜索這一個用途,其餘用途,之後再說。
2.配置文件
若是網絡裏全部的頻點都沒有NIT怎麼辦?咱們固然不能沒法搜索節目。一般來講,數字電視軟件都是運營商定製的,咱們交付軟件時,是知道網絡的相關狀態的。因此咱們能夠在軟件中增長一個配置文件,描述固然網絡裏面全部的頻率信息。
當咱們軟件啓動時,解析這個配置文件,就能夠獲得一個頻點列表,而後咱們一個一個鎖頻,解析pat,pmt,這些,就能夠獲得全部的節目信息了。
比起方法一缺點就是比較慢。
3.私有表
這種方法是一種比較不正式的作法。
可是13818給了咱們這種機制,咱們能夠自定義私有表,來描述本身須要的信息。固然節目信息能夠加入進去了。
一般會用到多網絡搜索時,一個比較常見的狀況是,衛星機,要搜索多個衛星的節目。可是多個衛星屬於多個網絡,衛星的位置,頻率都不同。沒法使用NIT搜索,這時咱們能夠加一個私有表,這個私有表描述多個衛星的節目信息,從而加快搜索速度。
四,其餘一些經常使用手法
一般來講,有線電視網絡都是比較穩定的,不會常常的改來改去。爲了加快切臺速度,會把節目的全部信息都保存起來,好比頻點,av/pid等等,這樣按遙控器時,就不用每次都搜索,直接讀文件獲得相關信息便可。