15

Flash を使用してオーディオを録音し、ノード サーバーにアップロードしています。Flash クライアントはjrecorderのバリエーションです。ユーザーが録音を完了すると、オーディオ ByteArray を POST リクエストのデータとして (Flash はファイルを作成できないため、フォームではなく) POST リクエストを使用してオーディオがアップロードされます (詳細はこちらを参照)。

以下のコードを使用して Node-land でファイルを正しく受信できますが、出てくる音声が壊れて何も聞こえません。そうは言っても、ファイルのコンテンツは VLC や他のプレーヤーで再生できます + Sox はそれを mp3 としてエンコードできます。

ノードを使用するときの私のコードは次のとおりです。

var express = require('express');
var app = express();

app.use (function(req, res, next) {
    req.rawBody = '';
    req.setEncoding('utf8');

    if(req.method.toLowerCase() == "post")
    {
        req.on('data', function(chunk) { req.rawBody += chunk });
        req.on('end', function() { done(req, res); });
    }

    next();
});

function done(req, res)
{
    fs.writeFile('abc.wav', req.rawBody, 'binary', function(err){
        if (err) throw err;

        // Save file to S3
    }   
}

同じ Flash クライアントを使用して Rails サーバーに POST リクエストを送信し、以下のコードを使用すると、ファイルは完全に保存されます。

def record
    file = request.raw_post

    # Save file to S3
end

私はノードの専門家ではないことに注意してください。チャンクを保存する代わりに何を使用すべきかについて提案がある場合は、コード例を投稿してください。現在の私の主な目的は、ノードでより効率的に達成する他の方法 (バッファ、ストリームなど) を検討する前に、これを動作状態にすることです。

4

1 に答える 1

28

次の行を取り出します

req.setEncoding('utf8');

データを受け取っているのではなく、utf8データを受け取っていbinaryます。

文字列の代わりにバッファを使用する方がよいでしょう

app.use(function(req, res, next) {
  var data = new Buffer('');
  req.on('data', function(chunk) {
      data = Buffer.concat([data, chunk]);
  });
  req.on('end', function() {
    req.rawBody = data;
    next();
  });
});
于 2013-05-16T23:15:03.483 に答える