zoukankan      html  css  js  c++  java
  • 使用vlc实现视频TS流的推送

    鉴于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流方案

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

  • 相关阅读:
    小记:利用递归调用循环寻找MP3文件的方法。
    模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。
    解析网络json数据,模拟美团界面显示。
    解析Json的谷歌官方方法Gson和阿里巴巴的fastJson方法。
    Json文件放入Assets文件,读取解析并且放入listview中显示。
    Android Fragment完全解析,关于碎片你所需知道的一切 (转)。
    安卓Json介绍(转)。
    Java中a+=b和a=a+b的区别
    线程安全的单例模式
    java中伪共享问题
  • 原文地址:https://www.cnblogs.com/chen110xi/p/6598589.html
Copyright © 2011-2022 走看看