通过vlcj把从摄像头取过来的视频转流

本文深入探讨了音视频直播流媒体技术的核心概念、关键组件及其应用实践,包括流媒体协议、WebRTC直播视频会议、流媒体直播转发服务器、P2P点对点直播和VOIP视频通话等内容。

//此方法是转为流形式,serverAddress,serverPort都是属于转后发布的地址和端口,id是后缀,当多个流转为一个发布地址时,增加此参数避免发布地址重复。

 private static String formatHttpStream(String serverAddress, int serverPort, String id) {
        StringBuilder sb = new StringBuilder(60);
        sb.append(":sout=#transcode{vcodec=theo,vb=2200,scale=1,acodec=vorb,ab=32,channels=2,samplerate=44100} :duplicate{dst=std{access=http,mux=ogg,");
        sb.append("dst=");
        sb.append(serverAddress);
        sb.append(':');
        sb.append(serverPort);
        sb.append("/");
        sb.append(id);
        sb.append("}}");
        return sb.toString();

    }

对于mux的封装,我们是公司要求用的ogg,当然根据特殊需要,也可以换成其他封装格式的,比如:ts

问题:转流的时候转为h264是最优化的,这种格式压缩比高,性能强,但是个人做这块的时候,我尝试转为h264,在浏览器出不来视频,没看出来是怎么回事。现在采用theo,可以实现目的,但是这种格式流量会费点。

 private Boolean isInterrupt = false;
    private String url;//摄像头访问地址
    private HeadlessMediaPlayer mediaPlayer;
    private String suffix;//发布后的最后一级访问路径
    private String serverAddress;//发布后的地址(IP)
    private int serverPort;//发布后的端口号


    public StreamTaskThread(String url, HeadlessMediaPlayer mediaPlayer,String serverAddress, int serverPort, String suffix) {
        this.url = url;
        this.mediaPlayer = mediaPlayer;
        this.serverAddress = serverAddress;
        this.serverPort = serverPort;
        this.suffix = suffix;


    }


    @Override
    public void run() {
        if (!this.isInterrupt) {
            System.out.println(url + "开始运行");
            try {

               //不管摄像头的类型是什么,浏览器的网络协议就是http,所以全部按照http协议转换。
                String options = formatHttpStream();

              //此处针对不同的协议类型,发布的时候也需要附带不同的参数。
                if (url.startsWith("http")) {
                    mediaPlayer.playMedia(url, options, ":sout-ts-dts-delay=100", ":sout-all", ":sout-keep");
                } else if (url.startsWith("rtsp") | url.startsWith("rtp")) {
                    mediaPlayer.playMedia(url, options, ":no-sout-rtp-sap",
                            ":sout-ts-dts-delay=100",
                            ":no-sout-standard-sap",
                            ":sout-all",
                            ":sout-keep");
                }
            } catch (Exception e) {
                System.out.println(url + "发布失败,从阻塞中退出...");
            }
        }
    }


    /**
     * The proper way to stop the thread
     */
    @Override
    public void interrupt() {
        this.isInterrupt = true;
        mediaPlayer.stop();
        try {
            super.interrupt();
        } catch (Exception e) {
            System.out.println("The thread has been interrupted.");
        }
    }


no-sout-rtp-sap   SAP宣告(默认关闭)
sout-ts-dts-delay=100 DTS延迟 (毫秒),延迟在流中与SCR进行比较的DTS(解码时间戳)和PTS(显示时间戳)数据,这将允许某些在客户端解码器中的缓存

no-sout-standard-sap SAP宣告(默认关闭)

sout-all 为所有ES开启流(默认关闭),流式化所有通量流(视频,音频和字幕) (默认关闭)

sout-keep 保持流输出打开(默认关闭)

如果有更优化的,望大神指教。

参考文档:http://cisco.chinaitlab.com/TCP/18644.html

http://network.51cto.com/art/201007/211664.htm

http://www.cnblogs.com/waimai/p/3342739.html

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值