NodeJS, OpenCV и потоковые изображения с использованием Net Socket
Моя конечная цель - потоковое видео с моего ноутбука на сервер. Я'я пытаюсь сделать это с помощью NodeJs на ноутбуке сервер. Я использую библиотеку OpenCV, чтобы захватить видео на ноутбуке и сохранить его в файл JPG. Затем я читаю файл и преобразую его в base64, чтобы можно было транспортировать его с помощью модуля Net.socket в Node. Это непрерывный процесс: захват, кодирование и отправка.
Вот код сервера для передачи только одного файла 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');
});
На стороне клиента цикл будет проверять каждый кусок данных на наличие ключевого слова, и если он найдет его, то все, что находится в буфере, будет записано в файл, и сброс буфера будет готов к следующему файлу.
Образец Advanced ClientI '
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.
Если бы кто-то мог сказать мне, если это нормальный способ сделать это и где я мог ошибиться.
Заранее спасибо!