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

编程入门 行业动态 更新时间:2024-10-08 20:36:55

使用 nodeJS 从 Zoneminder <a href=https://www.elefans.com/category/jswz/34/1771070.html style=流式传输视频时内存泄漏"/>

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

我想使用 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。这将是我最后的选择,因为我仍然想使用管道方法作为决定。

回答如下:

更多推荐

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

本文发布于:2024-05-13 13:48:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759642.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:流式   内存   视频   nodeJS   Zoneminder

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!