- vue-webSocket转码配置
const express = require("express");
const expressWebSocket = require("express-ws");
const ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath("C:/bin/ffmpeg");
const webSocketStream = require("websocket-stream/stream");
const WebSocket = require("websocket-stream");
const http = require("http");
let app = express();
app.use(express.static(__dirname));
expressWebSocket(app, null, {
perMessageDeflate: true
});
app.ws("/rtsp/:id/", rtspRequestHandle);
app.listen(8091);
console.log("express listened");
function rtspRequestHandle(ws, req) {
console.log("rtsp request handle");
let url = req.query.url;
const stream = webSocketStream(ws, {
binary: true,
browserBufferTimeout: 1000000
}, {
browserBufferTimeout: 1000000
});
// console.log("rtsp url:", url);
//console.log("rtsp params:", req.params);
var ffmpegCommand=ffmpeg(url)
.inputOptions(['-r 30','-rtsp_transport tcp', '-buffer_size 102400', '-fflags nobuffer','-analyzeduration 1000000']) // 这里可以添加一些 RTSP 优化的参数
.outputOptions(['-fflags nobuffer', '-tune zerolatency','-g 5' ,'-b:v 700000'])
.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.message);
})
.on("end", function () {
console.log(url, "Stream end!");
// 摄像机断线的处理
})
.outputFormat("flv").videoCodec("copy").noAudio();
try {
ffmpegCommand.pipe(stream);
} catch (error) {
console.log(error);
}
}
- 服务依赖
npm install express express-ws fluent-ffmpeg websocket-stream -S -D
npm install flv.js -S -D