gpt4 book ai didi

node.js - 通过 Node.js 代理传输 MJPEG 流

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:37 24 4
gpt4 key购买 nike

在 Linux 上使用 Motion,每个网络摄像头都在其自己的端口上作为流提供。我现在想使用 Node.js 在同一个端口上提供这些流。

  • 编辑:此解决方案现在有效。我需要从原始 mjpeg 流中获取边界字符串(在我的 Motion 配置中为“BoundaryString”)

app.get('/motion', function(req, res) {

var boundary = "BoundaryString";

var options = {
// host to forward to
host: '192.168.1.2',
// port to forward to
port: 8302,
// path to forward to
path: '/',
// request method
method: 'GET',
// headers to send
headers: req.headers
};

var creq = http.request(options, function(cres) {

res.setHeader('Content-Type', 'multipart/x-mixed-replace;boundary="' + boundary + '"');
res.setHeader('Connection', 'close');
res.setHeader('Pragma', 'no-cache');
res.setHeader('Cache-Control', 'no-cache, private');
res.setHeader('Expires', 0);
res.setHeader('Max-Age', 0);

// wait for data
cres.on('data', function(chunk){
res.write(chunk);
});

cres.on('close', function(){
// closed, let's end client request as well
res.writeHead(cres.statusCode);
res.end();
});

}).on('error', function(e) {
// we got an error, return 500 error to client and log error
console.log(e.message);
res.writeHead(500);
res.end();
});

creq.end();

});

我认为这会作为/motion 在 192.168.1.2:8302 提供 mjpeg 流,但事实并非如此。也许是因为它永远不会结束,而这个代理示例并不是真正的流示例?

最佳答案

通过 HTTP 流式传输不是问题。我经常用 Node 这样做。我认为您遇到的问题是您没有向客户端发送内容类型 header 。实际上,您无需发送任何响应 header 即可直接写入数据。

在发送任何实际内容数据之前,请务必将正确的内容类型 header 发送回发出请求的客户端。

您可能需要 handle multipart responses ,如果 Node 的 HTTP 客户端还没有为你做的话。

此外,我建议使用 Wireshark 对此进行调试,这样您就可以准确地看到正在发送和接收的内容。这将帮助您快速缩小此类问题的范围。

我还应该指出,一些客户端在分块编码方面存在问题,如果您未指定内容长度(您不能指定,因为它是不确定的),Node 将发送该编码。如果您需要禁用分块编码,请在此处查看我的回答:https://stackoverflow.com/a/11589937/362536基本上,您只需禁用它:response.useChunkedEncodingByDefault = false;。除非你需要,否则不要这样做!并确保在您的 header 中发送 Connection: close!

关于node.js - 通过 Node.js 代理传输 MJPEG 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14035864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com