2017-04-12 14 views
2

ウェブサーバー上で生のオーディオのチャンクを送信するサーバーがあります。アイデアは、それらを取得し、最もスムーズな再生を可能にする方法で再生することです。ここで生のオーディオデータのストリーミング中にウェブオーディオの再生に亀裂があります

は、コードの最も重要な部分である:

ws.onmessage = function (event) { 
    var view = new Int16Array(event.data); 
    var viewf = new Float32Array(view.length); 

    audioBuffer = audioCtx.createBuffer(1, viewf.length, 22050); 
    audioBuffer.getChannelData(0).set(viewf); 
    source = audioCtx.createBufferSource(); 
    source.buffer = audioBuffer; 
    source.connect(audioCtx.destination); 
    source.start(0); 
}; 

これがうまくちゃんと動作しますが、多少の傷は、再生中にあります。ネットワークの遅延は常に一定ではないので、データの最新チャンクは」doesnの前のプレイの終わりに正確に到着するので、2つのバッファを短時間一緒に演奏するか、まったく演奏しないようにすることができます。

は、私が試した:

  • は、次のいずれかをプレイする上でsource.onendedをフックするが、それはシームレスではありません。そこにすべてのチャンクの終わりに亀裂があり、各縫い目が全体的に蓄積され、再生が多くなっているようにより遅くストリームに比べて。
  • 現在再生中のバッファに新しいデータを追加することはできますが、これは禁止されているようです:バッファは固定サイズです。

再生を解決する適切な解決法はありますか?唯一の要件は、WebSocketからの非圧縮オーディオを再生することです。

EDIT:ソリューション:は、私は私のバッファの長さを知って考えると、私はこの方法の再生をスケジュールすることができます。

if(nextStartTime == 0) nextStartTime = audioCtx.currentTime + (audioBuffer.length/audioBuffer.sampleRate)/2; 
source.start(nextStartTime); 
nextStartTime += audioBuffer.length/audioBuffer.sampleRate; 

初めて、私は半-buffer-に再生開始のスケジュールを設定します予期しない最大待ち時間を可能にする。次に、バッファの最後の最後に次のバッファの開始時刻を格納します。

答えて

2

おそらくhttps://www.html5rocks.com/en/tutorials/audio/scheduling/から始めるべきです.WebAudioでスケジュールを設定する方法をよく説明しています。

また、PCMサンプルのサンプルレートを知っていることと、読んだサンプル数が分かっているという事実を利用する必要があります。これは、バッファを再生するのにかかる時間を決定します。これを使用して、次のバッファをスケジュールするタイミングを把握します。

(しかし、これかもしれないが台無しにあなたのタイミング、PCMのサンプルレートがaudioCtx.sampleRateと同じではない場合、データはリサンプリングされることに注意してください。

+0

ありがとう、これは私がやったことで、単に「今すぐ遊ぶ」というよりはむしろです。私は今より良く聞こえる何かを持っています! – Ploppe

0

これらの日にこれを処理するためのより良い方法はあり...考えます代わりにhttps://developer.mozilla.org/en-US/docs/Web/API/MediaSource

:メディアソースの拡張機能を使用して

  • 仕様:。https://www.w3.org/TR/media-source/
  • MDNバッファをスケジューリングして自分ですべて行う必要がある場合は、受信したデータを基本的にバッファにダンプし、ブラウザがHTTP経由のファイルのようにバッファリングされた再生を心配させるようにします。

    クロムは、WAVファイルの再生をサポートしています。あなたのデータは生のPCMであるので、あなたはWAVファイルのヘッダーを偽装する必要があります。幸いにも、これはそれほど難しいことではありません。http://soundfile.sapp.org/doc/WaveFormat/

+0

悲しいことに、Media Source Extensionsは現在WAVをサポートしていません。:(https://github.com/w3c/media-source/issues/55 – bertrandg

+0

こんにちはBrad、MediaSourceをデコードする方法を示すリンクはありますかmp3データチャンクはソケットから来ていますか? –

関連する問題