前端播放RTSP直播流、wss协议直播流

87 阅读2分钟

参考链接:

  1. 浏览器播放RTSP视频流完整解决方案指南-CSDN博客
  2. 在Web中使用jsmpeg.js低时延播放RTSP视频流(海康、大华)方案 - vue-jsmpeg-player-CSDN博客

在对接的过程中碰到了返回的是rtsp视频流的url,网页是不能直接播放的,所以需要客户端进行转码转成浏览器能够播放的格式,我使用的是参考链接1的方案3--使用现成的JavaScript库能够实现本地转码然后进行播放。

// websocket-proxy.js
const WebSocket = require('ws');
const http = require('http');
const { spawn } = require('child_process');

const server = http.createServer();
const wss = new WebSocket.Server({ server });

wss.on('connection', (ws) => {
    console.log('客户端连接');
    console.log('客户端连接1');

    // 启动FFmpeg将RTSP流转为MPEG1视频和MP2音频
    // 这个是开启子进程运行ffmpeg服务进行转码,我本地找不到ffmpeg临时弄的所以没有设置ffmpeg的环境变量
    // 然后就直接给的地址
    const ffmpeg = spawn('C:/ProgramData/chocolatey/lib/ffmpeg/tools/ffmpeg/bin/ffmpeg.exe', [
        '-i', 'rtsp://admin:xxx@xxx:xxx/Streaming/Channels/1501',
        '-f', 'mpegts',
        '-codec:v', 'mpeg1video',
        '-b:v', '800k',
        '-r', '25',
        '-s', '640x360',
        '-bf', '0',
        '-codec:a', 'mp2',
        '-ar', '44100',
        '-ac', '1',
        '-b:a', '64k',
        '-'
    ]);
    // 监听进度信息(stderr)
    ffmpeg.stderr.on('data', (data) => {
        console.log('进度信息:', data.toString());
        ws.send(data.toString()); // 如果需要发送给 WebSocket
    });
    // 将FFmpeg输出发送到WebSocket客户端
    ffmpeg.stdout.on('data', (data) => {
        console.log(data, 'data');
        ws.send(data);
    });

    ws.on('close', () => {
        ffmpeg.kill();
        console.log('客户端断开');
    });
});

server.listen(8080, () => {
    console.log('WebSocket代理服务器运行在端口8080');
});

<!DOCTYPE html>
<html>

<head>
    <title>JSMpeg RTSP播放器</title>
    <!--用的内网这个文件有时候加载不了-->
    <!-- <script src="https://cdn.jsdelivr.net/npm/jsmpeg-player@3.0.3/build/jsmpeg-player.min.js"></script> -->
    <script src="./jsmpeg.js"></script> 
</head>

<body>
    <canvas id="video-container"></canvas>

    <script>
        // 创建JSMpeg播放器
        const player = new JSMpeg.Player(`ws://xxx:xxx/cockpit/rtspVideoPlay?rtspUrl=rtsp://xxx/Streaming/Channels/1501`, {
            canvas: document.getElementById('video-container'),
            autoplay: true,
            audio: false,
            videoBufferSize: 512 * 1024
        });
        console.log(player, 'player');
    </script>
</body>

</html>

这个代码是能够直接播放并且运行的

wss协议播放直播流

  1. 我使用的是Home | Jessibuca

demo参考:

image.png