使用 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流方案

相关文章
相关标签/搜索