2014-08-11 12:45:50
分类: LINUX
鉴于Mpeg TS流播放的需求,使用 VLC作为Server来实现输出Mpeg TS
本文仅涉及如何使用VLC的Command来实现作为视频流Server通常可以使用下述四种方式来推送Mpeg TS1. UDP2. RTP3. RTSP4. 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-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:点击(此处)折叠或打开
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中多添加了几个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还有转码的需求,类似上述的扩展,可以使用点击(此处)折叠或打开
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)配置点击(此处)折叠或打开
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
其中,Access方式设置与否都可以。
在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的 standard2. 其中对于Port的指定,不再像UDP或者其他方式一样,使用Ip:Port,而是使用"dst=Ip,port=port1"的方式RTSP方式Server(10.22.76.56)配置点击(此处)折叠或打开
vlc test.ts --sout "#rtp{sdp=rtsp://:8554/test1}"
点击(此处)折叠或打开
vlc rtsp://10.22.76.56:8554/test1
点击(此处)折叠或打开
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}}"
点击(此处)折叠或打开
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
点击(此处)折叠或打开
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