新建项目文件夹 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
出现 express listened表示 服务启动成功!
通过ipconfig查看 本机IP
那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程序页
重启电脑,node服务会自己启动;恭喜你大功告成;如果执行失败请检查node环境和.bat文件,或留言咨询