私の最終目標は、ラップトップからサーバーにビデオをストリーミングすることです。ラップトップとサーバーでNodeJを使用してこれを達成しようとしています。OpenCV ライブラリを使用してラップトップでビデオをキャプチャし、jpg ファイルに保存します。次に、ファイルを読み取り、base64 に変換して、Node.js の Net.socket モジュールを使用して転送できるようにします。これは、キャプチャ、エンコード、および送信という連続したプロセスです。
以下は、1 つの 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 を次々に送信し、「EndOfFile」などのキーワードを使用して各「jpg」の終わりを区切ることです。送信する前にキーワード「EndOfFile」をbase64でエンコードされた画像に追加してこれを実行しようとしましたが、受信側で実際に失敗しました。
高度なサーバーの例:
fs.readFile('original.jpg', 'base64', function(err, image){
image += 'EndOfFile';
socket.write(image, 'base64');
});
クライアント側では、ループがキーワードのデータの各チャンクを調べ、それが見つかった場合、バッファ内にあるものはすべてファイルに書き込まれ、バッファがリセットされ、次のファイルの準備が整います。
サンプル アドバンスト クライアント
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 ではそれほど快適ではありません。
これがこれを行うための正気な方法であるかどうか、そしてどこが間違っているかを誰かが教えてくれたら.
前もって感謝します!