使用 nodeJS 从 Zoneminder 流式传输视频时内存泄漏

问题描述 投票:0回答:0

我想使用 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 packagestream.pipeline() 方法找到解决方案(实际上是为了在我的实现中发现错误)我也在考虑从 request package 切换到 axios.

我还找到了一个管道解决方案,但没有测试它:Nodejs request proxy stream(mjpeg) connection never ends。这将是我最后的选择,因为我仍然想使用管道方法作为决定。

node.js proxy video-streaming mjpeg zoneminder
© www.soinside.com 2019 - 2024. All rights reserved.