ske*_*rit 6 proxy mjpeg motion node.js
在Linux上使用Motion,每个网络摄像头都在其自己的端口上作为流提供.我现在想要使用Node.js在同一个端口上提供这些流.
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,但事实并非如此.也许是因为它永远不会结束,而这个代理示例并不是真正的流媒体示例?
通过 HTTP 进行流式传输不是问题。我经常使用 Node 这样做。我认为您遇到的问题是您没有向客户端发送内容类型标头。实际上,您可以直接写入数据,而无需发送任何响应标头。
在发送任何实际内容数据之前,请务必将正确的内容类型标头发送回发出请求的客户端。
如果 Node 的 HTTP 客户端还没有为您处理多部分响应,您可能需要处理它。
另外,我建议使用 Wireshark 进行调试,以便您可以准确地看到正在发送和接收的内容。这将帮助您快速缩小此类问题的范围。
我还应该注意到,一些客户端在分块编码方面存在问题,如果您不指定内容长度(您不能指定内容长度,因为它是不确定的),Node 将发送分块编码。如果您需要禁用分块编码,请参阅我的答案: https: //stackoverflow.com/a/11589937/362536 基本上,您只需要禁用它: response.useChunkedEncodingByDefault = false;。除非需要,否则不要这样做!并确保Connection: close在您的标头中发送一个!
| 归档时间: |
|
| 查看次数: |
6572 次 |
| 最近记录: |