通过Node.js代理pipe理MJPEGstream

在linux上使用Motion,每个networking摄像头都在自己的端口上作为一个stream提供服务。 我现在想要使用Node.js提供所有在同一端口上的stream。

  • 编辑:现在这个解决scheme工作。 我需要从原始的mjpegstream(这是我的Motionconfiguration中的“BoundaryString”)获取边界string
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(); }); 

我想这会提供mjpegstream192.168.1.2:8302作为/议案,但事实并非如此。 也许是因为它永远不会结束,而这个代理例子并不是真正的stream式例子吗?

通过HTTPstream式传输不是问题。 我经常用Node来完成。 我认为你遇到的问题是你没有发送一个内容types头到客户端。 实际上,您直接写数据而不发送任何响应标题。

在发送任何实际的内容数据之前,请确保将正确的内容types标题发送回发出请求的客户端。

如果Node的HTTP客户端还没有为你做,你可能需要处理多重响应 。

此外,我build议使用Wireshark进行debugging,以便您可以准确查看发送和接收的内容。 这将有助于您迅速缩小这类问题的范围。

我还应该注意到,一些客户端在分块编码方面存在问题,如果你没有指定内容长度(你不能因为它是不确定的)而被Node发送。 如果你需要禁用分块编码,请参阅我的答案在这里: https : //stackoverflow.com/a/11589937/362536基本上,你只需要禁用它: response.useChunkedEncodingByDefault = false; 。 除非你需要,否则不要这样做! 并确保发送一个Connection: close您的标题与它!

你需要做的只是在一个线程中请求mjpegstream,并用mjpeg或jpeg响应每个客户端(如果你需要IE支持的话)。