需求
Web浏览器不直接支持播放rtsp视频流,需将rtsp转成flv,提供给Web浏览器进行播放。
安装环境
二进制文件
或者
sudo apt install nodejs
sudo apt install npm
安装模块
npm install express express-ws fluent-ffmpeg websocket-stream -S -D
ffmpeg
apt install ffmpeg
或者
二进制文件
server.js
var express = require("express");
var expressWebSocket = require("express-ws");
var ffmpeg = require("fluent-ffmpeg");
ffmpeg.setFfmpegPath(__dirname + "/ffmpeg-6.0-amd64-static/ffmpeg");
var webSocketStream = require("websocket-stream/stream");
var WebSocket = require("websocket-stream");
var http = require("http");
function localServer() {
let app = express();
app.use(express.static(__dirname));
expressWebSocket(app, null, {
perMessageDeflate: true
});
app.ws("/rtsp/:id/", rtspRequestHandle);
app.listen(8858);
console.log("开启nodejs服务监听8858 rtsp端口")
}
function rtspRequestHandle(ws, req) {
const stream = webSocketStream(ws, {
binary: true,
browserBufferTimeout: 1000000
}, {
browserBufferTimeout: 1000000
});
let url = req.query.url;
let params = req.params;
if (params.id != "0") {
url += "?" + params.id;
}
try {
ffmpeg(url)
.addInputOption("-rtsp_transport", "tcp", "-buffer_size", "102400")
.on("start", function () {
console.log(url, "开始===========");
})
.on("codecData", function () {
console.log(url, "编码")
// 摄像机在线处理
})
.on("error", function (err) {
console.log(url, "出错: ", err.message);
//有可能客户端关闭请求
})
.on("end", function () {
console.log(url, "结束===========");
// 摄像机断线的处理
})
.outputFormat("flv").videoCodec("copy").noAudio().pipe(stream);
} catch (error) {
console.log(error);
}
}
localServer();
测试
- 下载测试资源
wget https://vfx.mtime.cn/Video/2023/08/18/mp4/230818134330888129.mp4 -O xxx.mp4
- ffmpeg推流
ffmpeg -re -i xxx.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://admin:abc123@192.168.66.116:554/h264/ch1/main/av_stream
- html文件播放
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="flv.min.js"></script>
<style>
body,
center {
padding: 0;
margin: 0;
}
.v-container {
width: 100%;
height: 100vh;
border: solid 1px red;
display: flex;
flex-flow: row wrap;
justify-content: space-evenly;
align-content: space-evenly;
}
video {
width: 33%;
}
</style>
</head>
<body>
<div class="v-container">
<video id="player1" muted autoplay="autoplay" preload="auto" controls="controls">
</video>
<video id="player2" muted autoplay="autoplay" preload="auto">
</video>
<video id="player3" muted autoplay="autoplay" preload="auto">
</video>
<video id="player4" muted autoplay="autoplay" preload="auto">
</video>
<video id="player5" muted autoplay="autoplay" preload="auto">
</video>
<video id="player6" muted autoplay="autoplay" preload="auto">
</video>
</div>
<script>
if (flvjs.isSupported()) {
for (let i = 1; i < 7; i++) {
var wsAddr = "ws://127.0.0.1:8858/rtsp/";
switch (i) {
case 1:
wsAddr += "0/?url=rtsp://admin:abc123@192.168.66.116:554/h264/ch1/main/av_stream";
break;
case 2:
wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.101:554/h264/ch1/main/av_stream";
break;
case 3:
wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.111:554/h264/ch1/main/av_stream";
break;
case 4:
wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.115:554/h264/ch1/main/av_stream";
break;
case 5:
wsAddr += "0/?url=rtsp://admin:abc123@192.168.64.120:554/h264/ch1/main/av_stream";
break;
case 6:
wsAddr += "channel=1&subtype=0/?url=rtsp://admin:abc123456@192.168.64.251:554/cam/realmonitor";
break;
default: break;
}
var videoElement = document.getElementById('player' + i);
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: wsAddr
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
}
}
</script>
</body>
</html>