Obrazy NodeJS, OpenCV i strumieniowe wykorzystujące gniazdo sieciowe

Moim głównym celem jest przesyłanie strumieniowe wideo z mojego laptopa na serwer. Próbuję to osiągnąć, używając NodeJs na laptopie i serwerze. Używam biblioteki OpenCV do przechwytywania wideo na laptopie i zapisywania go w pliku jpg. Następnie czytam plik i konwertuję go na base64, dzięki czemu mogę go przetransportować za pomocą modułu Net.socket w węźle. Jest to ciągły proces: przechwytywanie, kodowanie i wysyłanie.

Oto kod serwera do przesyłania tylko jednego pliku 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();
            });
        });
    });
});

Na kliencie pętlę, aż FIN zostanie odebrany z serwera. Oto kod klienta:

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

Problem polega na tym, że cały obraz nie jest wysyłany. Kiedy otwieram otrzymany plik, copy.jpg, zawsze brakuje części na dole.

W ostatecznej wersji celem jest wysłanie jednego jpg po drugim i wytyczenie końca każdego „jpg” za pomocą słowa kluczowego, takiego jak „EndOfFile”. Próbowałem to zrobić, dodając słowo kluczowe „EndOfFile” do mojego obrazu zakodowanego w Base64 przed wysłaniem, ale na końcu odbiorczym, który naprawdę został spieprzony.

Przykładowy zaawansowany serwer:

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

Po stronie klienta pętla sprawdzałaby każdy fragment danych dla słowa kluczowego i gdyby go znalazło, to cokolwiek znajduje się w buforze, byłoby zapisywane do pliku, a bufor resetowany, gotowy do następnego pliku.

Przykładowy klient zaawansowany

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

Dostałem to do pracy w Pythonie, więc myślę, że moja logika jest poprawna, ale nie jestem tak komfortowy w NodeJS.

Jeśli ktoś mógłby mi powiedzieć, czy jest to rozsądny sposób na zrobienie tego i gdzie mogłem pójść źle.

Z góry dziękuję!

questionAnswers(1)

yourAnswerToTheQuestion