使用Net Socket的NodeJS,OpenCV和流图像

Prz*_*ach 5 sockets base64 opencv video-streaming node.js

我的最终目标是将视频从笔记本电脑流式传输到服务器.我试图通过在笔记本电脑和服务器上使用NodeJ来实现这一目标.我使用OpenCV库在笔记本电脑上捕获视频并将其保存为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();
            });
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

在客户端上,我循环直到从服务器收到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);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

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

在最终版本中,目标是一个接一个地发送jpg并通过诸如'EndOfFile'之类的关键字划分每个'jpg'的结尾.我尝试通过在发送之前将关键字"EndOfFile"附加到我的base64编码图像来尝试这样做,但是在接收端真的搞砸了.

高级服务器示例:

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

一个客户端循环将检查关键字的每个数据块,如果找到它,那么缓冲区中的任何内容都将写入文件并重置缓冲区,为下一个文件做好准备.

高级客户端示例

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

我已经用Python工作了所以我认为我的逻辑是正确的但我在NodeJS中并不那么舒服.

如果有人能告诉我这是否是一种理智的方式来做到这一点,我可能在哪里出错了.

提前致谢!

Kor*_*nel 0

end我怀疑您在最后一位数据仍在缓冲时看到了事件。

尝试等待事件close而不是end事件发生。我不确定套接字,但在其他 Node API(例如 )中spawnend事件会在相关流刷新之前提前触发,因此可能仍然有缓冲数据在等待。

您可以通过管道来避免自己管理这个问题。使用套接字fs.createWriteStream()流到.pipe()文件。