10

私はこれをグーグルで調べてしばらくの間stackoverflowを調べてきましたが、解決策が見つかりませんでした-したがって投稿です。

私は好奇心からNode.jsとWebSocketをいじっています。いくつかのバイナリデータ(mp3)をクライアントにストリーミングしようとしています。これまでの私のコードは以下のとおりですが、明らかに意図したとおりに機能していません。

私の問題は、サーバーから実際にバイナリデータを送信していないことであり、説明/ヘルプが必要なことだと思います。

これが私のサーバーです...

var fs = require('fs');
var WebSocketServer = require('ws').Server;

var wss = new WebSocketServer({port: 8080,host:"127.0.0.1"});
wss.on('connection', function(ws) {    
    var readStream = 
    fs.createReadStream("test.mp3", 
     {'flags': 'r',
      'encoding': 'binary', 
      'mode': 0666, 
      'bufferSize': 64 * 1024});

    readStream.on('data', function(data) {
        ws.send(data, {binary: true, mask: false});
    });
});

そして私のクライアント...

context = new webkitAudioContext();
var ws = new WebSocket("ws://localhost:8080");
ws.binaryType = 'arraybuffer';

ws.onmessage = function (evt) {
    context.decodeAudioData(
    evt.data,
        function(buffer) {
            console.log("Success");
        }, 
        function(error) {
            console.log("Error");
        });
};

デコードの呼び出しは、常にエラーコールバックで終了します。これは、悪いデータを受信して​​いるためだと思います。

だから私の質問は、ファイルをバイナリとして正しくストリーミングする方法ですか?

ありがとう

4

2 に答える 2

4

サーバーが実行しているのは、64KBのチャンクのバイナリオーディオデータで構成されるメッセージをクライアントに送信していることです。クライアントは、を呼び出す前にオーディオファイルを再構築する必要がありますdecodeAudioData

decodeAudioDataクライアントがWebSocketでメッセージを受信するたびに電話をかけています。すべてのチャンクを追加するには、別のバッファーを作成する必要があります。次に、転送の完了時に、バッファにへの入力を与える必要がありますdecodeAudioData

現在、2つのオプションがあります。

  1. ストリームイベントを使用せずにファイル全体(fs.read)をロードし、ws.sendを使用してファイル全体を送信します(簡単に実行できます)。
  2. ストリームイベントを使用し、データのチャンクを受け入れるようにクライアントを変更し、呼び出す前にそれらをアセンブルしますdecodeAudioData
于 2013-03-26T16:05:43.303 に答える
0

問題が解決しました。

この問題は、「createReadStream()」に渡されるオプションから「'encoding':'binary'」パラメーターを削除することと、次のソリューションを組み合わせて修正しました。

nullエラーを返すdecodeAudioData

コメントの一部によると、createReadStreamオプションを更新すると、最初のチャンクが再生されていましたが、他のすべてのチャンクは、decodeAudioData()からのonErrorコールバックを実行していました。上記のリンクの解決策は私のためにこれを修正しました。decodeAudioData()は、受け取るチャンクをどのようにフォーマットするかに関して少し厄介なようです。それらは明らかに有効なチャンクでなければなりません...

decodeAudioData(WebAudio API)の「有効なmp3チャンク」を定義します

于 2013-03-28T10:12:41.650 に答える