使用网络插座的NodeJS,OpenCV的和图像流(NodeJS, OpenCV and Strea

2019-08-01 09:01发布

我的最终目标是流从我的笔记本电脑的视频服务器。 我试图通过使用在笔记本电脑和服务器的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舒适。

如果有人能告诉我,如果这是一个明智的办法做到这一点,并在可能我已经错了。

提前致谢!

Answer 1:

我怀疑你看到end的事件,而数据的最后一位仍在缓冲。

尝试等待close事件,而不是end事件。 我不知道插座,但在其他节点API,如spawn ,在end事件被解雇初期,相关的前流被刷新,所以仍可以缓冲数据等待。

你可能避免管道这个自己管理。 使用fs.createWriteStream().pipe()套接字流的文件。



文章来源: NodeJS, OpenCV and Streaming Images Using Net Socket