我的最终目标是流从我的笔记本电脑的视频服务器。 我试图通过使用在笔记本电脑和服务器的NodeJS做到这一点。 我使用OpenCV库捕捉笔记本电脑上的视频,并将其保存为JPG文件。 然后我读了文件,并将其转换为base64,这样我可以使用节点的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和划定通过关键词的每个“JPG”的结尾,如“EndOfFile”。 我试图通过发送之前,但在真正得到搞砸了接收端追加关键字“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舒适。
如果有人能告诉我,如果这是一个明智的办法做到这一点,并在可能我已经错了。
提前致谢!