5

私の最終目標は、ラップトップからサーバーにビデオをストリーミングすることです。ラップトップとサーバーで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 ではそれほど快適ではありません。

これがこれを行うための正気な方法であるかどうか、そしてどこが間違っているかを誰かが教えてくれたら.

前もって感謝します!

4

1 に答える 1