ウェブサーバー上で生のオーディオのチャンクを送信するサーバーがあります。アイデアは、それらを取得し、最もスムーズな再生を可能にする方法で再生することです。ここで生のオーディオデータのストリーミング中にウェブオーディオの再生に亀裂があります
は、コードの最も重要な部分である:
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-に再生開始のスケジュールを設定します予期しない最大待ち時間を可能にする。次に、バッファの最後の最後に次のバッファの開始時刻を格納します。
ありがとう、これは私がやったことで、単に「今すぐ遊ぶ」というよりはむしろです。私は今より良く聞こえる何かを持っています! – Ploppe