1. 程式人生 > >使用vlc實現視訊TS流的推送

使用vlc實現視訊TS流的推送

鑑於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)配置

點選(此處)摺疊或開啟

  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 --loop
如此,我們就實現
1. 使用指定的pid(video,audio,pmt等的pid)
2. 往指定的Dst:Port(10.22.76.103:3940)
3. 推送指定的視訊流 test.ts

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

點選(此處)摺疊或開啟

  1. vlc udp://@:3940
  2. 或者
  3. vlc udp://@10.22.76.103:3940
來進行視訊的播放

以上的 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

本文轉自: 

http://blog.chinaunix.net/uid-26527046-id-4409467.html

-----------------------參考資料------------------------
VLC釋出TS流
使用VLC搭建簡單媒體流伺服器