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ę!