1、大概流程api
一、cable tside
信號(signel)--》tuner--》demux-》video,audio解碼編碼-》輸出顯示編碼
二、本地ts視頻
file--》demux-》video,audio解碼編碼-》輸出顯示內存
若是有解擾邏輯,則須要在demux後對video,audio包解擾處理。資源
三、對cable ts 的錄製即同步
信號(signel)--》tuner--》demux-》磁盤--》demux--》video,audio解碼編碼-》輸出顯示,即多了一個步驟,須要將解擾的流保存到磁盤中,若是須要播放磁盤中的文件,則將磁盤中的文件數據傳給demux,也就是一個逆向過程。固然demux的處理牽涉到section,filter另作討論。it
2、如下將分節討論io
一、TUNER 調諧器容器
通常有有線cable,衛星satellite,地面territory 3種type。tuner工做須要知道頻率freq,符號率symb,QAM大小,tuner獲取到的信號signel有信號強度,誤碼率,質量,等級等,主要就是鎖住某個須要的頻點去獲取信息(模擬信號-》數字信號)。通常問題就是鎖不住頻點,拿不到signel。
目前通常是STB 的tuner某一時刻只能處理一個頻點信息,也許之後會啓動同時處理多個頻點或多個tuner的雙xx模式或多xx模式。終端屏幕的愈來愈大,徹底是能夠在一個屏上顯示多個流的。
二、Demux
終端主要是解複用,也就是解析本身想要的數據,並分類的處理。這塊須要專業的MPEG/DVB相關協議知識,主要是PSI/SI。
通常牽涉到的概念有filter,channel,section,pid等,通常來講一個Channel對應一個PID,對應多個Filter。首現要知道頻點,須要tuner到某個頻點上去鎖頻,將模擬數據轉換爲數字信號。而後數字信號會送到Demux解複用,這一坨數據不少,你須要經過必定的規則去獲取你想要的數據。
filter過濾用,就是tuner拿到的那一坨數據有不少,但只須要將你想要的數據過濾出來。怎麼過濾?通常咱們要知道咱們想要的數據在哪一個PID,對應的段數據可能還須要再細分類,那你還須要將section前幾個字節(byte)傳下去,讓demux只過濾出PID下同時匹配section前幾個字節數據對應的包數據。好比。。。xx xx xx 01(PID)xx 02 03 04 05 06 07 xx 。。。當前頻點拿到的數據不少,但我只須要PID爲0x, section前3個字節爲02.03.04的表的數據,首先filter會過濾出pid爲0x01的全部的數據,而後在這些數據中過濾出前3個字節爲02 03 04 的那些數據。再細化分類的話拿到這些數據你就要按SI/PSI協議或你本身私有的協議來了。
channe通道l咱們能夠認爲是一個容器,或再簡單點就認爲它是一塊內存。這塊容器就是用來裝咱們filter出來的數據的,因此通常channel是掛在filter上的。一個filter能夠有多個channels,或一個channel有多個filter,具體要看平臺實現須要。
固然因爲硬件特性,signel環境,參數狀況,可能獲取不到咱們想要的數據,不可能一直讓filter,channel一直去那那個不存在或有問題的數據的,就須要有一個超時機制:在這個時間段沒法拿到數據,通知上層,demux拿不到你想要的數據,你改幹嗎幹嗎去吧。同時demux釋放filter,channel等相關資源。
demux處理後,filter過濾的數據經過回調或其餘方式給上層,上層拿到想要的數據再實現具體的應用。
三、video,audio 編解碼
通常來講解碼後就能夠輸出output了。
目前經常使用的數據電視用到的制式有PAL,NTSC等
視頻輸出通常有CVBS,ypbpr,YUV,hdmi(高清用的多)等
視頻輸出通常用到視頻層,靜態層(still,IFRAME通常用到)
輸出節目長度寬度比國內通常有4/3,16/9
經常使用支持的視頻有:MPEG1,2,4;H264等
經常使用支持的音頻有:MPEG1,2,ADTS,AC3,DTS等
通常對音視頻會分配專門的固定的filter,channel。要播放某個節目,必須經過SI/PSI獲取到,freq,vpid,apid,pcrpid等。
播放音視頻就是讓tuner鎖對應freq的頻點,demux去過濾出vpid,apid的數據包。其中經過pcrpid能夠獲取一個時間參考系。
vpid拿到視頻包,其中有I,P,B幀;
apid拿到音頻包,其中有I,P,B幀。音視頻同步就是經過I,P,B幀的PTS去同步pcrpid獲取的時間參考系。