使用vlc實現視訊TS流的推送
阿新 • • 發佈:2019-02-11
鑑於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)配置
點選(此處)摺疊或開啟
- 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-
1. 使用指定的pid(video,audio,pmt等的pid)
2. 往指定的Dst:Port(10.22.76.103:3940)
3. 推送指定的視訊流 test.ts
在server推送這個視訊流後,client(10.22.76.103)使用command:
點選(此處)摺疊或開啟
- vlc udp://@:3940
- 或者
- vlc udp://@10.22.76.103:3940
以上的 server配置中,Server本地並不會播放視訊,僅僅是推送TS,如果要實現在 Server本地播放,可以使用
點選(此處)摺疊或開啟
- 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 "#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還有轉碼的需求,類似上述的擴充套件,可以使用
點選(此處)摺疊或開啟
- 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
--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)配置
點選(此處)摺疊或開啟
- 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
- 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
在server推送這個視訊流後,client(10.22.76.103)使用command:
點選(此處)摺疊或開啟
- vlc rtp://@10.22.76.103:3940
- 或者
- vlc rtp://@:3940
對於需要在本地顯示和需要使用轉碼的,可以採用:
點選(此處)摺疊或開啟
- 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
- 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)配置
點選(此處)摺疊或開啟
- vlc test.ts --sout "#rtp{sdp=rtsp://:8554/test1}"
在server推送這個視訊流後,client(10.22.76.103)使用command:
點選(此處)摺疊或開啟
- 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
對於需要在本地顯示和轉碼的,可以參考:
點選(此處)摺疊或開啟
- vlc test.ts --sout "#duplicate{dst=display, dst=rtp{sdp=rtsp://:8554/test1}}"
- 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)配置
點選(此處)摺疊或開啟
- 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:
點選(此處)摺疊或開啟
- vlc http://10.22.76.56:3940
同樣,對於有在本地顯示和轉碼需求的,可以參考:
點選(此處)摺疊或開啟
- 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
- 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搭建簡單媒體流伺服器