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

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

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

 

鑑於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


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

發佈了45 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章