WebSocket整合直播

由于浏览器不支持对于rtmp协议推拉流,所以需要后台对传输的数据进行处理,将数据转接,为了实现其实时性,使用websocket将数据传输

先使用obs和vlc测试正常的推拉流是否正常

然后在跑本地后台传输视频

使用JavaCV技术传输音视频

java 复制代码
        //创建+设置采集器
        FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(inputPath);
        grabber.setOption("rtsp_transport", "tcp");
        grabber.setImageWidth(960);
        grabber.setImageHeight(540);

        //开启采集器
        grabber.start();

        //直播播放窗口
        CanvasFrame canvasFrame = new CanvasFrame("直播------来自"+inputPath);
        canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvasFrame.setAlwaysOnTop(true);
        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();

        //播流
        while (true){
            Frame frame = grabber.grabImage();  //拉流
            opencv_core.Mat mat = converter.convertToMat(frame);
            canvasFrame.showImage(frame);   //播放
        }

测试时正常显示页面

对音视频解析转为二进制流传递给前端

java 复制代码
//读取rtmp文件流
        // 获取视频源
        log.info("音频流地址{}",url);
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(url);
        try {
            grabber.start();
            Frame frame = null;
            long startTime = System.currentTimeMillis();
            ByteArrayOutputStream wavBuffer = new ByteArrayOutputStream();
            while ((frame = grabber.grabFrame()) != null) {
                log.info("解流");
                Buffer[] samples = frame.samples;
                int sampleRate = frame.sampleRate;
                int audioChannels = frame.audioChannels;
                int sampleSizeInBit = 16;
                //一秒数据量
                Thread.sleep(1000);
                int oneSecondBytes = sampleRate * sampleSizeInBit / 2 * audioChannels;

                Java2DFrameConverter converter = new Java2DFrameConverter();
                BufferedImage image=converter.convert(frame);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ImageIO.write(image, "jpg", baos);
                byte[] imageData = baos.toByteArray();
                webSocketService.sendBroadcast(imageData);

设置1秒时长的延迟,防止服务器因为拉流崩溃

相关推荐
网硕互联的小客服31 分钟前
如何在Ubuntu系统上查看和刷新DNS缓存?操作方法与原理解析
运维·服务器·网络·ubuntu
Lynne3091 小时前
工业边缘计算网关到底解决什么问题?从设备接入到AI推理的技术链路
网络·数据分析·数据
鲁邦通物联网1 小时前
海外设备怎么远程维护?工业路由器远程运维架构设计
运维·网络·智能路由器·工业路由器·工业级路由器·5g路由器·5g工业路由器
艾芯微科技1 小时前
ESDUNL24VC1 单向 ESD 静电保护二极管参数、电路设计与 PCB 防护布局
网络·单片机·嵌入式硬件·集成测试·51单片机
一条泥憨鱼1 小时前
苍穹外卖【day10| 来电提醒和客户催单】
java·后端·websocket·苍穹外卖
❁满城风絮*2 小时前
Nginx—从默认页面到高性能网
网络·nginx
java_nnnn2 小时前
面试题(网络部分前传)-13问
服务器·网络·网络协议·tcp/ip·面试
码少女3 小时前
Linux--套接字编程
linux·服务器·网络
上海云盾-小余3 小时前
业务被 DDoS 打崩?四层、七层攻击特征与防护方案复盘
网络·网络协议·tcp/ip·ddos
优化Henry3 小时前
学习笔记之关于MME不通问题归纳
运维·网络·学习·5g·信息与通信