我想使用 NodeJS 从 Zoneminder 应用流式传输视频。 ZoneMinder 存储来自 ip 摄像机的视频,并可以将其流式传输到 HTML 中。我在使用自签名证书访问外部 zoneminder 服务器时遇到问题,因为我的网络应用程序需要 https。所以我决定使用 nodeJS 作为媒介。 我设法找到了解决方案: Request.pipe() JPEG 流.
我的代码如下。 HTML:
<!DOCTYPE html>
<html>
<body>
<img id="zmvideo" src="/videostream?monitor=3" alt="no video">
</body>
</html>
nodeJS 服务器:
const request = require('request');
var http = require('http');
const express = require('express');
const app = express();
app.get("/", function(request, response){
response.sendFile(__dirname + "/index.html");
});
app.get('/videostream', async (req, res) => {
let url1=`http://192.168.22.127/zm/cgi-bin/nph-zms?mode=jpeg&scale=100&user="watchinguser"&pass="somepassword"`;
req.pipe( request({
url: url1,
qs: req.query,
method: "stream"
},function(error, response, body){console.error(`Error ${error}`); console.log(req.query);}
)).pipe( res );
})
var httpServer = http.createServer(app);
httpServer.listen(3000);
按预期运行,但存在内存泄漏问题。一段时间后,nodeJS 服务器吃掉所有 RAM,杀死自己并重新启动。
我决定用pipeline替换pipe。 结果我的 nodeJS 服务器看起来像这样:
const { pipeline } = require('stream');
const request = require('request');
var http = require('http');
const express = require('express');
const app = express();
app.get("/", function(request, response){
response.sendFile(__dirname + "/index.html");
});
app.get('/videostream', async (req, res) => {
let url1=`http://192.168.22.127/zm/cgi-bin/nph-zms?mode=jpeg&scale=100&user="watchinguser"&pass="somepassword"`;
pipeline(req,
request({url: url1,qs: req.query,method: "stream"},function(error, response, body){console.error(`Video Stream Request Error ${error}`); console.log(req.query);}),
(err) => {
if (err)
{
console.log('Video Stream Pipeline error');
console.log(err);
res.end(err.message);
}
else
{
console.log('pipeline successfull')
}
}
);
})
var httpServer = http.createServer(app);
httpServer.listen(3000);
没有错误,打开 index.html 时我也看到“pipeline successfull”消息。但是没有来自 Zoneminder 的视频。
我需要帮助。我最好的选择是使用 request package 和 stream.pipeline() 方法找到解决方案(实际上是为了在我的实现中发现错误)我也在考虑从 request package 切换到 axios.
我还找到了一个管道解决方案,但没有测试它:Nodejs request proxy stream(mjpeg) connection never ends。这将是我最后的选择,因为我仍然想使用管道方法作为决定。