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秒时长的延迟,防止服务器因为拉流崩溃

相关推荐
wjcroom几秒前
一个可以在线多人玩的五子棋开发与布署方法-WebRTC和WebSocket的测试方法
websocket·网络协议·webrtc
数安旭说1 小时前
终端防火墙深度拆解:网络隔离、进程级管控与流量治理的落地避坑指南
网络·数据安全·企业安全·防火墙·终端安全·终端防火墙·违规外联
数智工坊1 小时前
NTIRE2024×4图像超分竞赛综述|Mamba崛起、数据缩放、频域增强成为新趋势
网络·人工智能·深度学习·cnn·机器人
聚美智数2 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全
一个向上的运维者2 小时前
Kubernetes 网络三部曲:CNI、kube-proxy 与 CoreDNS 是如何协作的?
网络·容器·kubernetes
2301_815091013 小时前
TCP 并发服务器模型:4 种 IO 模型完整梳理
服务器·网络·tcp/ip
斑马1393 小时前
Linux软件编程学习笔记(十二)——TCP并发服务器模型
java·服务器·网络
学着改变2753 小时前
2026便携式超声波流量计性能白皮书 户外巡检适用性横评
大数据·网络·人工智能·科技·产品运营·量子计算
rcms152702692184 小时前
Novellus Systems 02-033134-00晶圆底座加热器
网络
马立杰4 小时前
IE241210_路由安全技术(三层安全)
网络·安全