2014年7月9日 星期三

stream DVBT by vlc on debian

換了新工作,
第六個工作天,發現新工作好像是比原來想像中還要更深的火坑Q.Q
所以開始要來做長期抗戰的準備...
第一個想到的是,我追了一段時間的連續劇,雨後驕陽

如果可以,凡事最好先準備替代方案...
除了先錄起來以外,所以我又回頭研究DVBT串流的方案...
(之前研究過,當初是為了在家裡的時候,可以很方便的用PAD看不同頻道XD)
最初的想法,DVBT的TS本身就是mpeg2或h264的編碼,
不需要重新轉碼,Pad或手機應該都可以輕鬆處理。

那最大的問題就在串流的部分了...
基本上也是東參考西參考來的,就直接整理如下...


  1. FunUV數位電視棒的Linux支援
    Siano MDTV receiver(usb vid:187f pid:0202)
    http://cateee.net/lkddb/web-lkddb/SMS_SIANO_MDTV.html
    Linux Kernel support的範圍2.6.31–2.6.39, 3.0–3.6,基本上都有支援
    但插上去的時候會有錯誤,因為缺少正確的Firmware
    https://forums.mageia.org/en/viewtopic.php?f=23&t=4353
    下載firmware,更名為對應的檔案名稱
    以我的為例
    $cd /lib/firmware
    $sudo wget http://www.steventoth.net/linux/sms1xxx/sms1xxx-hcw-55xxx-dvbt-02.fw
    $sudo mv sms1xxx-hcw-55xxx-dvbt-02.fw dvb_nova_12mhz_b0.inp
    
    接著掛載對應的module
    $sudo modprobe smsdvb
    
    重新插拔電視棒應該可以在dmesg看到正確的註冊USB裝置了
  2. 安裝vlc,使用台灣的數位電視組態檔
    $sudo apt-get install vlc
    
    vlc支援數位電視棒,但是要正確播放需要不少設定,包括頻率、頻寬、編碼、調變等等阿哩不搭的
    所以有好心人士整理了一份!
    http://electronmania.blogspot.tw/2012/07/channelsconf-15sd4hd.html
    但是在這邊只是拿來參考用的XD,因為我並不是要直接看,而是要串流出去
    至於如果將整個頻道一起串流出去我還沒想到怎麼幹,需要再花時間研究研究
  3. 透過cvlc與vlm在console下直接進行串流轉送
    基本上參考這篇網誌
    http://evilshit.wordpress.com/2013/08/10/how-to-stream-multiple-tv-channels-with-a-single-dvb-t-tuner-using-vlc/
    建立dvbstream.vlm時有些地方需特別注意
    new dvbt1 broadcast enabled
    setup dvbt1 input "dvb-t://"
    #第一個電視棒,如果有一個以上的電視棒,這邊需要注意
    setup dvbt1 option dvb-adapter=0
    #指定頻率,因為tuner一次只能設定一個頻道,怎樣才能動態切換這個還要研究研究XD
    #頻率請參考上一段的台灣電視組態檔
    #這裡以台視為例,台視的頻率是581MHz
    setup dvbt1 option dvb-frequency=581000000
    #頻寬,台灣使用的頻寬為6MHz
    setup dvbt1 option dvb-bandwidth=6
    #頻道ID,數位電視當中一個頻道可以放很多節目,以台視為例
    #頻道ID為400,401,402,403 其中403為HD頻道
    setup dvbt1 option programs=400,401,402,403
    setup dvbt1 option ts-es-id-pid
    
    #這裡使用的是走http通訊協定,http格式的寫法就不多解釋了
    #需特別注意的是,output的設定必須要同一行
    #否則cvlc會有vlm錯誤的訊息
    setup dvbt1 output #duplicate{dst=std{
    access=http,mux=ts,dst=:8080/400},select="program=400",dst=std{access=http,mux=ts,dst=:8080/401},select="program=401",dst=std{access=http,mux=ts,dst=:8080/402},select="program=402",dst=std{access=http,mux=ts,dst=:8080/403},select="program=403"}
    
    control dvbt1 play
    
    這部分可以對照著上面參考的網誌來看

    最後執行cvlc來進行串流
    $ cvlc -vvv --extraintf telnet --vlm-conf dvbstream.vlm
    
    -vvv是verbose,除錯用的參數
    如果功能正常可以移掉這個參數
  4. 最後,用播放軟體,例如vlc、windows media player,或是android上的vlc、mxplayer,開啟網路串流
    輸入網址就可以看到畫面了
    以我的為例,輸入http://192.168.1.10:8080/400
    就可以正常播放!!!!

不過在測試的過程中,播放HD頻道時,
似乎因為我的CPU太虛弱(VIA C7-1500),
第一次還因為verbose的訊息,疑似當掉的現象
第二次移掉verbose後,用不同的播放軟體播放HD頻道時,有各種奇怪的狀況
例如沒有畫面,但網路有在動
或是只有聲音沒有畫面
透過手機、平板的mxplayer播放時,手機是完全不會動
平板的話,使用軟體解碼器播放時,畫面有出現,但是花屏非常嚴重
使用硬體解碼器播放時,則是直接閃退...

但是先前在主要的工作機上(Intel e6420)測試卻沒有這種現象...

以後有空再繼續研究好了
先留個紀錄:)

3 則留言:

johnny 提到...

請問~不知道支援Linux,那有沒有支援android。不知道有沒有考慮研究一下?

johnny 提到...

不知道有支援android的可能性?是否考慮研究一下?

mosquito chen 提到...

Android有,但實現的難度更高
因為大多數的Android裝置,底層kernel沒有開啟dvb裝置的支援,如果你要用Android實現的話,可能你得先弄到完整的source自己編image。

如果想要用這種嵌入式的方案
便宜的可以參考Rasberry Pi,網路上有不少資源
不介意花點錢,要省事一點
可以直接參考一些現成方案
例如Android可以考慮iDTV
或圓剛的數位電視分享盒
或群暉的nas就已經包好一個可以直接使用的方案