8

LinuxでMotionを使用すると、すべてのWebカメラが独自のポートでストリームとして提供されます。Node.jsを使用して、これらのストリームをすべて同じポートで提供したいと思います。

  • 編集:このソリューションが機能するようになりました。元のmjpegストリーム(モーション構成では「BoundaryString」でした)から境界文字列を取得する必要がありました

app.get('/motion', function(req, res) {

    var boundary = "BoundaryString";

  var options = {
    // host to forward to
    host:   '192.168.1.2',
    // port to forward to
    port:   8302,
    // path to forward to
    path:   '/',
    // request method
    method: 'GET',
    // headers to send
    headers: req.headers
  };

  var creq = http.request(options, function(cres) {

        res.setHeader('Content-Type', 'multipart/x-mixed-replace;boundary="' + boundary + '"');
        res.setHeader('Connection', 'close');
        res.setHeader('Pragma', 'no-cache');
        res.setHeader('Cache-Control', 'no-cache, private');
        res.setHeader('Expires', 0);
        res.setHeader('Max-Age', 0);

    // wait for data
    cres.on('data', function(chunk){
      res.write(chunk);
    });

    cres.on('close', function(){
      // closed, let's end client request as well 
      res.writeHead(cres.statusCode);
      res.end();
    });

  }).on('error', function(e) {
    // we got an error, return 500 error to client and log error
    console.log(e.message);
    res.writeHead(500);
    res.end();
  });

  creq.end();

});

これは192.168.1.2:8302のmjpegストリームを/motionとして提供すると思いますが、そうではありません。おそらくそれが終わらないためであり、このプロキシの例は実際にはストリーミングの例ではありませんでしたか?

4

2 に答える 2

2

HTTPを介したストリーミングは問題ではありません。私は定期的にNodeでそれを行います。あなたが抱えている問題は、コンテンツタイプのヘッダーをクライアントに送信していないことだと思います。実際には、応答ヘッダーを送信せずにデータを書き込むことができます。

実際のコンテンツデータを送信する前に、必ず正しいコンテンツタイプヘッダーをリクエストを行うクライアントに返送してください。

NodeのHTTPクライアントがまだ処理していない場合は、マルチパート応答を処理する必要がある場合があります。

また、これをWiresharkでデバッグして、送受信されているものを正確に確認できるようにすることをお勧めします。これは、このような問題をすばやく絞り込むのに役立ちます。

また、一部のクライアントではチャンクエンコーディングに問題があることにも注意してください。チャンクエンコーディングは、コンテンツの長さを指定しない場合にNodeが送信するものです(コンテンツの長さが指定されていないため、指定できません)。チャンクエンコーディングを無効にする必要がある場合は、ここで私の答えを参照してください: https ://stackoverflow.com/a/11589937/362536 基本的に、あなたはそれを無効にする必要があります: response.useChunkedEncodingByDefault = false;。ただし、必要がない限り、これを行わないでください。Connection: closeそして、それと一緒にあなたのヘッダーで必ず送ってください!

于 2012-12-26T04:07:44.563 に答える
0

必要なのは、1つのスレッドで必要なときにmjpegストリームを要求し、各クライアントにmjpegまたはjpegで応答することです(IEサポートが必要な場合)。

于 2014-01-03T09:34:00.390 に答える