2

この質問は、@thejh のおかげで解決された以前の質問のフォローアップです。

テキストを音声に変換し、データを「チャンク」データとしてクライアントに提供しようとしています。これまでのところ、ヘッダーは次のようになっています。

res.writeHead(200, {
  'Content-Type': 'audio/wav',
   // I tried 'audio/x-wav' as well
  'Transfer-Encoding': 'chunked'
});

そして、テキストのスニペットをキュー内のオーディオに変換し (base64 でエンコードされたデータとして返されます)、次のように提供します。

var src = Base64Audio.replace("data:audio/x-wav;base64,","");
var binAudio = new Buffer( src, 'base64');
res.write(binAudio);

すべての情報が転送されてクライアントに送信されますが、何らかの理由でブラウザー (私は Firefox 7.0.1 でテストしています) がそれを再生し、最初のチャンクの後で停止します。これはオーディオの途中終了を示す結果/デモです。これはgithubで実行されているコードです。

どうしてこれなの?これは、x-wav データに End のようなメタデータがあるか、ヘッダー/メタデータに指定された長さがあるためですか? もしそうなら、このメタデータは何ですか?ブラウザが受信したチャンクを正常に連結するように編集する方法はありますか?

ヘッダーは'Content-Length': Buffer.length知っていますが、この場合、ストリーム全体がどれくらいの長さになるかわかりません。

誰でも提案を提供できますか。ブラウザがバッファを適切に連結するように、送信前にバッファを編集することはできますか?

4

2 に答える 2

1

あなたの最善の策は、icecast/shoutcast によって送信されるように、これをオーディオ ストリームに似せることだと思います。FireFox がデフォルトでそれを処理するとは思いません (古いバージョンでは処理されません)。そのため、ストリームを再生するための素敵なフラッシュ プラグインがたくさんあります。

ストリームのようにするには、さらにいくつかのヘッダーを設定する必要があります。

HTTP/1.0 200 OK
Content-Type: audio/wav
Transfer-Encoding: chunked
icy-br: ##
ice-audio-info:bitrate=##;samplerate=#####
icy-description:Some Name
icy-genre:Alternative
icy-name:Name
icy-pub:0
icy-url:http://yoursite.com
Server:Whatever you want
Cache-Control: no-cache
Connection: Keep-Alive
于 2011-12-12T23:17:32.330 に答える
0

これに対する答えはわかりませんが、Shoutcast ストリームがどのようにネットワークを通過しているかを見てみましょう。それらは無限に長い mp3 ファイルであり、それがどのように行われるかを見てみると、同様の概念が適用されるはずです。

于 2011-12-02T14:24:27.050 に答える