NodeJS,OpenCV和stream媒体图像使用networking套接字

我的最终目标是将video从笔记本电脑传输到服务器。 我试图通过在笔记本电脑和服务器上使用NodeJs来实现这一点。 我使用OpenCV库来捕获笔记本电脑上的video,并将其保存为jpg文件。 然后我读取文件并将其转换为base64,以便我可以使用Node中的Net.socket模块来传输它。 这是一个连续的过程:捕获,编码和发送。

这里是传输一个jpg文件的服务器代码:

var cv = require('opencv'); var fs = require('fs'); var net = require('net'); var camera = new cv.VideoCapture(0); var server = net.createServer(); server.listen('50007', '127.0.0.1'); server.on('connection', function(socket){ camera.read(function(image){ image.save('original.jpg'); fs.readFile('original.jpg', 'base64', function(err, image){ socket.write(image, 'base64', function(){ socket.end(); }); }); }); }); 

在客户端循环,直到从服务器接收到FIN。 这里是客户端代码:

 var net = require('net'); var fs = require('fs'); var client = new net.Socket(); var buffer =''; client.setEncoding('base64'); client.connect('50007', '127.0.0.1', function(){ console.log('Connecting to server...'); }); client.on('data', function(data){ buffer += data; }); client.on('end', function(){ var dataBuffer = new Buffer(buffer, 'base64'); fs.writeFile('copy.jpg', dataBuffer, function(err){ if(err){ console.log(err); } }); }); 

问题是整个图像实际上并没有被发送。 当我打开接收到的文件copy.jpg时,底部总会有一个块丢失。

在最终版本中,目标是发送一个接一个的jpg,并通过关键字“EndOfFile”来分隔每个“jpg”的结尾。 我试图通过在发送之前将关键字“EndOfFile”附加到我的base64编码图像上,但在接收端真的搞砸了。

示例高级服务器:

 fs.readFile('original.jpg', 'base64', function(err, image){ image += 'EndOfFile'; socket.write(image, 'base64'); }); 

一个客户端循环会检查关键字的每个数据块,如果发现它,那么缓冲区中的任何内容都将被写入文件和缓冲区重置,准备下一个文件。

示例高级客户端

 client.on('data', function(data){ if(data.indexOf('EndOfFile') > 0){ buffer += data.substr(0, data.indexOf('EndOfLine')); var dataBuffer = new Buffer(buffer, 'base64'); fs.writeFile('copy.jpg', dataBuffer, function(err){ if(err){ console.log(err); } }); buffer = ''; } else { buffer += data; } }); 

我已经得到了这个在Python工作,所以我认为我的逻辑是正确的,但我不像在NodeJS confortable。

如果有人能告诉我这是否是一种理智的做法,哪里可能出错。

提前致谢!

我怀疑你会看到end事件,而最后一点数据仍然被缓冲。

尝试等待close事件而不是end事件。 我不确定套接字,但是在其他的节点API(如spawnend事件在相关stream被刷新之前被提前触发,所以可能还有缓冲数据在等待。

你可以避免通过pipe道来自己pipe理。 使用fs.createWriteStream().pipe()套接字stream到文件。