通过 Node.js 代理传输 MJPEG 流
Posted
技术标签:
【中文标题】通过 Node.js 代理传输 MJPEG 流【英文标题】:Pipe an MJPEG stream through a Node.js proxy 【发布时间】:2012-12-11 17:35:14 【问题描述】:在 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();
);
我认为这会将 192.168.1.2:8302 处的 mjpeg 流作为 /motion 提供,但事实并非如此。 也许是因为它永远不会结束,而且这个代理示例并不是真正的流式示例?
【问题讨论】:
你可以考虑改用 nginx。 需要是节点解决方案 【参考方案1】:通过 HTTP 流式传输不是问题。我经常用 Node 来做这件事。我认为您遇到的问题是您没有向客户端发送内容类型标头。实际上,您无需发送任何响应标头即可直接写入数据。
确保在发送任何实际内容数据之前,将正确的内容类型标头发送回发出请求的客户端。
你可能需要handle multipart responses,如果 Node 的 HTTP 客户端还没有为你做这件事。
另外,我建议使用 Wireshark 进行调试,这样您就可以准确地看到发送和接收的内容。这将帮助您快速缩小此类问题的范围。
我还应该注意,一些客户端在分块编码方面存在问题,如果您不指定内容长度(您不能指定内容长度,因为它是不确定的),这就是 Node 将发送的内容。如果您需要禁用分块编码,请在此处查看我的答案:https://***.com/a/11589937/362536 基本上,您只需禁用它:response.useChunkedEncodingByDefault = false;
。除非你需要,否则不要这样做!并确保在您的标头中发送Connection: close
!
【讨论】:
块的东西是 mjpeg 流的问题。我看到一个普通的 jpeg 流总是作为一个整体提供的。所以我应该等待一整个帧,然后才将其发送给客户端。 啊,找到了!在我的响应标头中,我需要设置原始 mjpeg 流中使用的多部分边界(在运动中,它始终是相同的“BoundaryString”)这样我就可以转发这些块而无需自己添加任何数据。【参考方案2】:您需要做的是在需要时仅在一个线程中请求 mjpeg 流,并使用 mjpeg 或 jpeg 响应每个客户端(如果您需要 IE 支持)。
【讨论】:
以上是关于通过 Node.js 代理传输 MJPEG 流的主要内容,如果未能解决你的问题,请参考以下文章
通过套接字连接将 https 代理请求传递到命名管道(node.js)
如何使用 Node.js 通过 ffmpeg 流式传输 MP4 文件?
带有自定义 Http(s) 代理和 Connect.js 中间件的 Node.js 代理
哪些库可用于使用 WritableStream 和 Node.js Readable 等标准流 API 将数据从浏览器流式传输到服务器? [关闭]