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

一、 编译安装VLC 使用vlc-1.0.5.tar.bz2 + live555-2010.01.tar.gz export MYDIR=/root/lf 将live555-2010.01.tar.gz和vlc-1.0.5.tar.bz2放置在$MYDIR下 cd $MYDIR (一) 编译liveMedia tar xvfz live555-2010.01.tar.gz cd live ./genMakefiles linux make (二) 安装libdvbpsi rpm -hiv libdvbpsi-0.1.7-1.el4.rf.i386.rpm rpm -hiv libdvbpsi-devel-0.1.7-1.el4.rf.i386.rpm 需要什么rpm可到http://apt.sw.be/redhat/el4/en/i386/rpmforge/RPMS/中下载 (三) 编译VLC 1. configure ./configure --prefix=/usr --enable-debug --disable-avcodec --disable-hal --disable-avformat --disable-swscale --disable-a52 --disable-x11 --disable-sdl --disable-fribidi --disable-dbus --disable-libgcrypt --disable-gnutls --disable-remoteosd --disable-skins2 --disable-qt4 --disable-libxml2 --disable-lua --disable-xcb --disable-alsa --disable-v4l2 --disable-qt --enable-run-as-root --enable-live555 --with-live555-tree=$MYDIR/live --disable-mad --disable-postproc --enable-dvbpsi --enable-x264 2. make 3. 出现错误error: syntax error before "vlc_spinlock_t": ../include/vlc_threads.h:240: error: syntax error before "vlc_spinlock_t" …… make[4]: *** [control/libvlc_la-vlm.lo] Error 1 make[4]: Leaving directory `/root/lf/vlc-1.0.5/src' make[3]: *** [all-recursive] Error 1 make[3]: Leaving directory `/root/lf/vlc-1.0.5/src' make[2]: *** [all] Error 2 make[2]: Leaving directory `/root/lf/vlc-1.0.5/src' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/root/lf/vlc-1.0.5' make: *** [all] Error 2 通过以下命令解决: sed -e 's/define\s*_POSIX_SPIN_LOCKS\s*/define _POSIX_SPIN_LOCKS -1 \/\/ wrong: /g' -i /usr/include/bits/posix_opt.h 4. 重试make出现error: `AFS_SUPER_MAGIC' undeclared: file.c:52:28: linux/magic.h: No such file or directory file.c: In function `IsRemote': file.c:141: error: `AFS_SUPER_MAGIC' undeclared (first use in this function) file.c:141: error: (Each undeclared identifier is reported only once file.c:141: error: for each function it appears in.) file.c:142: error: `CODA_SUPER_MAGIC' undeclared (first use in this function) file.c:143: error: `NCP_SUPER_MAGIC' undeclared (first use in this function) file.c:144: error: `NFS_SUPER_MAGIC' undeclared (first use in this function) file.c:145: error: `SMB_SUPER_MAGIC' undeclared (first use in this function) make[5]: *** [libaccess_file_plugin_la-file.lo] Error 1 make[5]: Leaving directory `/root/lf/vlc-1.0.5/modules/access' make[4]: *** [all-recursive] Error 1 make[4]: Leaving directory `/root/lf/vlc-1.0.5/modules/access' make[3]: *** [all] Error 2 make[3]: Leaving directory `/root/lf/vlc-1.0.5/modules/access' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/root/lf/vlc-1.0.5/modules' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/root/lf/vlc-1.0.5' make: *** [all] Error 2 将下面的magic.h文件复制到/usr/include/linux/目录下 5. make install 6. 检查 vlc -l | grep access_output access_output_udp UDP stream output access_output_http HTTP stream output access_output_file File stream output access_output_dummy Dummy stream output access_output_rtmp RTMP stream output vlc -l | grep dvbpsi mux_ts TS muxer (libdvbpsi) (四) 进行RTSP To TS转码:  不经视音频重编码的直接转码: vlc rtsp://172.17.0.219:8554/1 --sout '#standard{access=http, mux=ts, dst=172.17.0.100:1234}' 注:黑体部分为本机IP和端口,不能是127.0.0.1 vlc rtsp://172.17.0.219:8554/1 --sout '#duplicate{dst="std{access=udp, mux=ts, dst=172.17.1.116:1234}"}' vlc rtsp://172.17.0.219:8554/1 --sout '#duplicate{dst="std{access=http, mux=ts, dst=172.17.0.100:1234}"}' 二、 视音频重编码的VLC编译安装 (一) 需要编译安装ffmpeg ./configure --prefix=/usr --enable-libfaac --enable-libx264 --enable-pthreads --disable-ffserver --disable-ffplay --enable-gpl --enable-nonfree [root@localhost ffmpeg-0.6.7]# make common.mak:28: *** unterminated call to function `foreach': missing `)'. Stop. 出现上面错误需要更新Make版本,使用make-3.81.tar.gz ./configure --prefix=/usr;make;make install In file included from libavdevice/v4l.c:33: /usr/include/linux/videodev.h:56: error: syntax error before "ulong" /usr/include/linux/videodev.h:72: error: syntax error before '}' token 编辑/usr/include/linux/videodev.h第56行,把ulong改为 unsigned long (二) 编译VLC ./configure --prefix=/usr --enable-debug --enable-avcodec --disable-hal --disable-avformat --disable-swscale --disable-a52 --disable-x11 --disable-sdl --disable-fribidi --disable-dbus --disable-libgcrypt --disable-gnutls --disable-remoteosd --disable-skins2 --disable-qt4 --disable-libxml2 --disable-lua --disable-xcb --disable-alsa --disable-v4l2 --disable-qt --enable-run-as-root --enable-live555 --with-live555-tree=$MYDIR/live --disable-mad --disable-postproc --enable-dvbpsi --enable-x264 没有--enable-avcodec运行VLC转码会出现"cannot find video decoder"的错误。 (三) 进行RTSP To TS转码: vlc tcp://172.17.0.199:7799 --sout '#duplicate{dst="transcode{venc=x264{profile=baseline},vcodec=h264,acodec=mpga,vb=644,ab=56}:std{access=udp,mux=ts,dst=172.17.0.219:1234}"}' 使用VLC转时,不要激活转码 可正常工作的选项: :sout=#http{mux=ts,dst=:8080/1} :sout-keep :sout=#udp{mux=ts,dst=172.17.1.116:1234} :sout-keep http://www.videolan.org/doc/videolan-howto/en/ch09.html ffmpeg -i "rtsp://172.17.0.219:8554/1" -acodec libfaac -vcodec libx264 -vpre default -f mpegts -async 1 udp://127.0.0.1:3344 ./configure --prefix=/usr --enable-libfaac --enable-libx264 --enable-pthreads --disable-ffserver --disable-ffplay --enable-gpl --enable-nonfree 转码 ffmpeg -i "rtsp://172.17.0.219:8080/1" -acodec libfaac -vcodec libx264 -vpre default -f mpegts -async 1 udp://172.17.0.219:3344
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值