使用 VLC做爲Server來實現輸出Mpeg TS

使用vlc實現視頻TS流的推送 2014-08-11 12:45:50html

分類: LINUX服務器

鑑於Mpeg TS流播放的需求,使用 VLC做爲Server來實現輸出Mpeg TS
  
本文僅涉及如何使用VLC的Command來實現做爲視頻流Server

一般可使用下述四種方式來推送Mpeg TS
1. UDP
2. RTP
3. RTSP
4. HTTP

同時附帶在加入轉碼後的實現方式

UDP方式
Server(10.22.76.56)配置

tcp

點擊(此處)摺疊或打開ide

  1. vlc test.ts --sout "#standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=10.22.76.103:3940}" --sout-all --sout-keep --loopoop

如此,咱們就實現
1. 使用指定的pid(video,audio,pmt等的pid)
2. 往指定的Dst:Port(10.22.76.103:3940)
3. 推送指定的視頻流 test.ts

在server推送這個視頻流後,client(10.22.76.103)使用command:

測試

點擊(此處)摺疊或打開ui

  1. vlc udp://@:3940
    spa

  2. 或者
    .net

  3. vlc udp://@10.22.76.103:3940unix

來進行視頻的播放

以上的 server配置中,Server本地並不會播放視頻,僅僅是推送TS,若是要實如今 Server本地播放,可使用

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}}" --sout-all --sout-keep --loop

從中對比能夠看出,若是須要本地播放,只是在sout中多添加了幾個option的配置而已
--sout "#duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}}"
其中,綠色表示單純往Dst:port推送TS
藍色表示若是要在本地播放,除去須要推送的dst外,還須要在本地display

若是Server推送的TS還有轉碼的需求,相似上述的擴展,可使用

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}}" --sout-all --sout-keep --loop

從中能夠看出,對於轉碼的需求,也僅僅是添加了藍色的一段options而已
--sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.56:3940}}"

對於轉碼,有音頻和視頻不一樣相似的轉碼方式,組合後其方式會更多,具體的可使用VLC的UI配置方式,在選擇不一樣的轉碼方式後,來查看對應生成的command有何不一樣,在此僅僅列舉其中的幾種:
 Video - H.264 + MP3 (MP4)
 vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100

 Video - H.264 + MP3 (TS)
 vcodec=h264,vb=800,acodec=mpga,ab=128,channels=2,samplerate=44100

 Audio - MP3 (MP4)
 vcodec=none,acodec=mpga,ab=128,channels=2,samplerate=44100

 Video for MPEG4 1080p TV/device
 vcodec=h264,vb=3500,width=1920,height=1080,acodec=mp3,ab=192,channels=2,samplerate=44100

須要注意:
1. 使用轉碼後,從測試效果來看,一般會出現馬賽克。是由於轉碼須要消耗必定的cpu資源致使?
2. 使用UDP等方式推送的TS,Client在接收時候須要" vlc udp://@:3940", "vlc udp://@10.22.76.103:3940" 中須要加上 "@"。在後續使用TCP的 RTSP和HTTP中,能夠不用加上@

對於Client的接收方式,以上server不一樣的推送方式下,都是同樣的


RTP方式
Server(10.22.76.56)配置

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},dst=172.22.102.55,port=3940}" --sout-all --sout-keep --loop

  2. vlc test.ts --sout "#rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=udp,dst=172.22.102.55,port=3940}" --sout-all --sout-keep --loop

其中,Access方式設置與否均可以。

在server推送這個視頻流後,client(10.22.76.103)使用command:

點擊(此處)摺疊或打開

  1. vlc rtp://@10.22.76.103:3940

  2. 或者

  3. vlc rtp://@:3940


對於須要在本地顯示和須要使用轉碼的,能夠採用:

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display, dst=rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},dst=10.22.76.55,port=3940}}" --sout-all --sout-keep --loop

  2. vlc test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display, dst=rtp{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},dst=10.22.76.55,port=3940}}" --sout-all --sout-keep --loop

注意點:
1. 在使用rtp方式時候,dst=後面使用的是 rtp,而不在是默認udp的 standard
2. 其中對於Port的指定,再也不像UDP或者其餘方式同樣,使用Ip:Port,而是使用"dst=Ip,port=port1"的方式

RTSP方式
Server(10.22.76.56)配置

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#rtp{sdp=rtsp://:8554/test1}"


在server推送這個視頻流後,client(10.22.76.103)使用command:

點擊(此處)摺疊或打開

  1. vlc rtsp://10.22.76.56:8554/test1


對於RTSP或者如下的HTTP方式下,和上述UDP/RTP推送方式有些不一樣:
1. 使用UDP方式下,Server會將TS流推送到制定的 Client,所以,server和client應該是能互相通訊的。因此Client只須要在本地從本地網卡接收TS就能夠了,所以能夠省略Ip
2. 使用Http方式下,Server是將TS流推送到本地的網卡上(嚴格來講數據尚未真實發送給網卡,只是在網卡的特定Port上偵聽Client的鏈接),Client須要使用TCP來鏈接Server(使用制定的Ip和Port),在創建tcp鏈接後,server會將TS推送給Client。所以Server能夠省略Ip,可是Client必須制定server的Ip和Port

對於須要在本地顯示和轉碼的,能夠參考:

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display, dst=rtp{sdp=rtsp://:8554/test1}}"

  2. vlc test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display, dst=rtp{sdp=rtsp://:8554/test1}}"


注意點:
1. 在這種模式下,Client的接收方式和以前的UDP方式不一樣。能夠是"vlc rtsp://@IP" 或者是 "vlc rtsp://IP"的方式,@是可選的
2. Server在推送時候,會須要在Port後添加目錄,好比上述的"/test1"。天然client在接收時候也須要指定
3. 若是Server在推送時候,省略了Ip的指定,則該Server上全部的Interface上,都能接收Client的請求

HTTP方式
Server(10.22.76.56)配置

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=http,dst=10.22.76.56:3940}" --sout-all --sout-keep --loop


在server推送這個視頻流後,client(10.22.76.103)使用command:

點擊(此處)摺疊或打開

  1. vlc http://10.22.76.56:3940


一樣,對於有在本地顯示和轉碼需求的,能夠參考:

點擊(此處)摺疊或打開

  1. vlc test.ts --sout "#duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=http,dst=10.22.76.56:3940}}" --sout-all --sout-keep --loop

  2. vlc test.ts --sout "#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:duplicate{dst=display,dst=standard{mux=ts{pid-video=100,pid-audio=101,pid-pmt=98},access=http,dst=10.22.76.56:3940}}" --sout-all --sout-keep --loop


-----------------------參考資料------------------------
VLC發佈TS流
使用VLC搭建簡單媒體流服務器
IPTV支持TS流方案

相關文章
相關標籤/搜索