NodeJS, OpenCV e Streaming Images Usando o Net Socket

Meu objetivo final é transmitir vídeo do meu laptop para um servidor. Eu estou tentando fazer isso usando NodeJs no laptop e no servidor. Eu uso a biblioteca OpenCV para capturar o vídeo no laptop e salvá-lo em um arquivo jpg. Eu então leio o arquivo e o converto para base64 para que eu possa transportá-lo usando o módulo Net.socket no Node. Este é um processo contínuo: capturar, codificar e enviar.

Aqui está o código do servidor para apenas transmitir um arquivo 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();
            });
        });
    });
});

No cliente, faço loop até que o FIN seja recebido do servidor. Aqui está o código do cliente:

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);
        }
    });
});

O problema é que a imagem inteira não é realmente enviada. Quando eu abro o arquivo recebido, copy.jpg, há sempre um pedaço faltando na parte inferior.

Na versão final, o objetivo é enviar um jpg após o outro e delimitar o final de cada 'jpg' por meio de uma palavra-chave como 'EndOfFile'. Eu tentei fazer isso adicionando a palavra-chave 'EndOfFile' à minha imagem codificada em base64 antes de enviá-la, mas na extremidade de recepção que realmente se estragou.

Exemplo de servidor avançado:

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

Uma do lado do cliente, o loop examinaria cada pedaço de dados para a palavra-chave e, se a encontrasse, o que estiver no buffer seria gravado no arquivo e a redefinição do buffer, pronta para o próximo arquivo.

Exemplo de cliente avançado

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;
    }
});

Eu consegui isso para trabalhar em Python, então eu acho que minha lógica está correta, mas eu não sou tão confortável no NodeJS.

Se alguém pudesse me dizer se isso é uma maneira sensata de fazer isso e onde posso ter errado.

Desde já, obrigado!

questionAnswers(1)

yourAnswerToTheQuestion