Nodejs - RTSP 实时摄像头提要 - 分布式架构
Nodejs - RTSP live camera feed - distributed architecture
我们有一个要求,我们传递相机详细信息并需要在网络浏览器中向最终用户显示实时流。由于这是分布式架构,因此我们可以仅使用 Rest API 或套接字通信来完成。
技术栈
- Nodejs - 在后端
- Angular - 在前端
作为解决方案的一部分,我找到了 npm - node-rtsp-stream - https://www.npmjs.com/package/node-rtsp-stream 但问题是我们必须创建 API 并在 api 中传递流,至少要有 20-30 个摄像头才能看到直播。从前端传入端口,在后端使用。
问题 -
- 如何在用户单击暂停按钮时停止流,我尝试使用 API - '/camera/feed/stop/:port' 但它不起作用?
- 在创建API流时,流很容易混淆,如何管理ws端口?
- 使用 RTSP 在客户端显示流的任何更好的解决方案 URL
我尝试了以下解决方案,但没有成功
const Stream = require('node-rtsp-stream');
app.get('/camera/feed/:camera/:port', (req, res) => {
console.log(req.params.port);
if (req.params.camera == 1) {
var ip_address2 = "192.168.1.12"
var username2 = "admin";
var password2 = "admin";
} else if (req.params.camera == 2) {
var ip_address2 = "192.168.1.10"
var username2 = "admin";
var password2 = "admin";
}
stream = new Stream({
streamUrl: 'rtsp://' + username2 + ':' + password2 + '@' + ip_address2 + ':554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif',
wsPort: req.params.port
});
res.send('OK');
});
// Stop the stream that produce using ffmpeg
app.get('/camera/feed/stop/:port', (req, res) => {
stream.stop() // This is not make ffmpeg to stop the processing stream
res.send('OK');
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
index.html
var canvas3 = document.getElementById('canvas3');
var websocket = new WebSocket("ws://127.0.0.1:9999");
var player3 = new jsmpeg(websocket, { canvas: canvas3, autoplay: true, loop: true })
谢谢。
要暂停流,您可以使用播放器中的stop()
方法,player3.stop()
我找到了解决方案。在 API 响应中传递流对象,其中包含 PID res.send(stream);
对于 stop/kill FFmpeg 进程,我们可以使用来自前端的 PID kill(req.params.pid);
我们有一个要求,我们传递相机详细信息并需要在网络浏览器中向最终用户显示实时流。由于这是分布式架构,因此我们可以仅使用 Rest API 或套接字通信来完成。
技术栈
- Nodejs - 在后端
- Angular - 在前端
作为解决方案的一部分,我找到了 npm - node-rtsp-stream - https://www.npmjs.com/package/node-rtsp-stream 但问题是我们必须创建 API 并在 api 中传递流,至少要有 20-30 个摄像头才能看到直播。从前端传入端口,在后端使用。
问题 -
- 如何在用户单击暂停按钮时停止流,我尝试使用 API - '/camera/feed/stop/:port' 但它不起作用?
- 在创建API流时,流很容易混淆,如何管理ws端口?
- 使用 RTSP 在客户端显示流的任何更好的解决方案 URL
我尝试了以下解决方案,但没有成功
const Stream = require('node-rtsp-stream');
app.get('/camera/feed/:camera/:port', (req, res) => {
console.log(req.params.port);
if (req.params.camera == 1) {
var ip_address2 = "192.168.1.12"
var username2 = "admin";
var password2 = "admin";
} else if (req.params.camera == 2) {
var ip_address2 = "192.168.1.10"
var username2 = "admin";
var password2 = "admin";
}
stream = new Stream({
streamUrl: 'rtsp://' + username2 + ':' + password2 + '@' + ip_address2 + ':554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif',
wsPort: req.params.port
});
res.send('OK');
});
// Stop the stream that produce using ffmpeg
app.get('/camera/feed/stop/:port', (req, res) => {
stream.stop() // This is not make ffmpeg to stop the processing stream
res.send('OK');
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
index.html
var canvas3 = document.getElementById('canvas3');
var websocket = new WebSocket("ws://127.0.0.1:9999");
var player3 = new jsmpeg(websocket, { canvas: canvas3, autoplay: true, loop: true })
谢谢。
要暂停流,您可以使用播放器中的stop()
方法,player3.stop()
我找到了解决方案。在 API 响应中传递流对象,其中包含 PID res.send(stream);
对于 stop/kill FFmpeg 进程,我们可以使用来自前端的 PID kill(req.params.pid);