通过node搭建webSockert视频解析流服务

289 阅读2分钟

新建项目文件夹 video-node-serve 新建 /page.json

  "name": "rtspflv",
  "version": "0.0.0",
  "private": true,
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "babel-node -- ./server.js",
    "build": "webpack --progress --config webpack.config.js"
  },
  "dependencies": {
    "@ffmpeg-installer/ffmpeg": "^1.0.20",
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "express-ws": "^4.0.0",
    "fluent-ffmpeg": "^2.1.2",
    "http": "0.0.1-security",
    "http-errors": "~1.6.3",
    "jade": "~1.11.0",
    "morgan": "~1.9.1",
    "websocket-stream": "^5.5.2"
  },
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-loader": "^8.2.5",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "webpack": "^5.73.0",
    "webpack-cli": "^4.10.0",
    "uglifyjs-webpack-plugin": ""
  }
}

新建/server.js

const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegPath);
let webSocketStream = require('websocket-stream/stream');
let WebSocket = require('websocket-stream');
let http = require('http');
let expressWebSocket = require('express-ws');

let app = express();
app.use(express.static(__dirname));
expressWebSocket(app, null, {
    perMessageDeflate: true
});
app.ws("/rtsp/:id/", rtspRequestHandle)
app.listen(8888);
console.log("express listened")

function rtspRequestHandle(ws, req) {
    console.log("rtsp request handle");
    const stream = webSocketStream(ws, {
        binary: true,
        browserBufferTimeout: 1000000
    }, {
        browserBufferTimeout: 1000000
    });
    //let url = req.query.url + '?device=' + req.params.device + '&channel=' + req.params.channel + '&streamtype=' + req.params.streamtype + '&token=' + req.params.token + '&type=' + req.params.type;
    let url = req.query.url;
    console.log("rtsp url:", url);
    console.log("rtsp params:", req.params);
    try {
        ffmpeg(url)
            .addInputOption("-rtsp_transport", "tcp", "-buffer_size", "0")  // 这里可以添加一些 RTSP 优化的参数
            .on("start", function () {
                console.log(url, "Stream started.");
            })
            .on("codecData", function () {
                console.log(url, "Stream codecData.")
                // 摄像机在线处理
            })
            .on("error", function (err) {
                console.log(url, "An error occured: ", err);
            })
            .on("end", function () {
                console.log(url, "Stream end!");
                // 摄像机断线的处理
            })
            .outputFormat("flv").videoCodec("copy").noAudio().pipe(stream);
    } catch (error) {
        console.log(error);
    }
}

其中 app.listen(8888); 是webSockert的监听端口 win+R 打开 cmd 窗口执行 node server.js

image.png 出现 express listened表示 服务启动成功! 通过ipconfig查看 本机IP

image.png

那WS的服务端地址可以写成: ws://192.168.3.116:8888/rtsp/1/?url=${rtspUrl} 其中rtspUrl rtspUrl = 'rtsp://admin:123456@192.168.1.212:554/Streaming/Channels/401'; 至此 服务端node服务搭建完毕!

技能优化小建议:开机自启动 node视频解析服务; 非必要 下面的步骤可以省略。(主要是防止时间过长忘记node目录和启动方法。所以设置开机自启;这就是传说中的重启可以解决99%的问题,哈哈哈) 新建 /bin 新建/bin/start.bat 内容如下:

echo.
echo [信息] 使用 nodeJS 运行 webSocker flv视频流解析服务!启动中。。。。
echo.

%~d0
cd %~dp0

cd ..
node server.js

echo [信息]OK

cmd执行:shell:startup 可打开windows系统开机自启动 .bat程序页 image.png

image.png

image.png 重启电脑,node服务会自己启动;恭喜你大功告成;如果执行失败请检查node环境和.bat文件,或留言咨询