4

multipart/x-mixed-replaceデータをブラウザーにストリーミングするnodejsを使用して小さなアプリケーションを作成します。

このデータは画像データを使用して作成されますが、画像データは時間の経過とともに変化する可能性があるため、ブラウザではビデオのように見えます。画像データはウェブカメラから作成されるため、ブラウザではライブストリーミングのように見えます。

しかし、パフォーマンスはあまり良くありません。

私は他のいくつかのアプローチを試しました:-最初に:socket.ioを使用して画像をブラウザにプッシュします。ここでは画像からbase64データを使用し(このデータをプッシュします)、ブラウザで画像を再作成します(jpeg):正常に動作します。ただし、クライアントは1つまたは2つだけです。_ 2番目:ブラウザからnodejsサーバーへのポーリングを使用します。これは私が好きではありません。

これがコードです:(nodejsサーバーのコードの一部)私はexpressを使用してhttpサーバーを作成します:

app.get('/videoStream',function(req,response){   
    response.writeHead(200,{
        'Content-Type': 'multipart/x-mixed-replace;boundary="' + boundary + '"',
        'Connection': 'keep-alive',
        'Expires': 'Fri, 01 Jan 1990 00:00:00 GMT',
        'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate',
        'Pragma': 'no-cache'
    });
    response.write('--'+boundary+'\n');

    events.addListener('imagen_recibida',function(){
        fs.readFile(__dirname + '/image.jpeg',function(err,data){
             if(err) return send404(response);
             response.write('Content-Type: image/jpeg\n Content-Length: '+data.length+'\n\n');
             response.write(data);
            response.write('\n--'+boundary+'\n');
           });
    });

イベント「imagen_recibida」が発生すると、ディスクからイメージを読み取り、ブラウザにデータを書き込みます。

したがって、2つの質問:

これのパフォーマンスを改善するためのアプローチはありますか?(画像をディスクに書き込んでから、ブラウザに送信するために読み取るのは良いトリックとは思えません)

パフォーマンスを向上させるためにこれを別の形式にエンコードする方法はありますか?

どうもありがとう。

PD:RPC呼び出しを介して別の関数の別のプロセスから画像データを受信するため、画像はディスクに書き込まれ、次に読み取られてブラウザーに送信されます。

4

1 に答える 1

3

socket.ioを使用して、生成されたファイルのURLをプッシュし、クライアントでJavascriptを使用して、フレームを示すimgタグの「src」属性を置き換えることができます。この場合、静的ファイルをサーバー化するために通常のWebサーバーを使用するか、静的ファイルを提供するために接続モジュールを使用できます。これは、base64でエンコードされたデータをプッシュするよりも効率的である可能性があります。

上記のアプローチを使用する場合は、少なくともfs.readFileを使用しないでください...これにより、ファイル全体が毎回メモリに保存されます。util.pump()を使用するか、「drain」イベントでReadStream / WriteStreamを手動で使用して、メモリ使用量を最小限に抑えます。複数のクライアントが接続されている場合、パフォーマンスの問題はガベージコレクションが原因である可能性があります。

別のアプローチは、画像をffmpegにフィードして適切なビデオストリームをエンコードし、次にffserverにフィードしてビデオプレーヤーにストリーミングするバックグラウンドプロセスを用意することです。

于 2011-06-16T15:08:30.633 に答える