2

オーディオを (私の場合は からgetUserMedia) キャプチャして再生したいと考えています。次のように、一連の AudioBuffers を配列にプッシュできます。

var recorder = audio_context.createJavaScriptNode(256, 2, 2);
recorder.onaudioprocess = function(e) {
  recorded.push(e.inputBuffer.getChannelData(0));
  // or just:
  // recorded.push(e.inputBuffer);
};
recorder.connect(audio_context.destination);

recordedしかし、配列内のバッファを再生するにはどうすればよいでしょうか?

これらを 1 つのバッファにマージして再生する方法はcreateBufferSource?

まったく別のアプローチ?

4

2 に答える 2

2

オーディオの録音が完了すると、次のことができるようになります。

var bufferIndex = 0;
recorder.onaudioprocess = function (e) {
  var outputData = e.outputbuffer.getChannelData(0);
  var recordedData = recorded[bufferIndex];
  for (var i = 0; i < recordedData.length; i++) {
    outputData[i] = recordedData[i];
  });
  bufferIndex++;
}

(おそらくもっとシンプル/クリーンにすることができます。これは説明のためだけのものです)

于 2012-10-31T08:38:57.353 に答える
1

私の意見では、これを行う最も簡単な方法は、あなたが提案したように、それらを単一のAudioBufferにマージし、AudioBufferSourceNodeを介してそれを再生することです。まず、メソッドを介して新しいAudioBufferオブジェクトを作成しますcontext.createBuffer。具体的には、引数としてnumberOfChannels、length、およびsampleRateを受け取るバージョンです。長さ(秒単位)を計算するには、結合されたすべてのサンプル配列のサイズを知る必要があります...それらをキャプチャするときに、これの現在の合計を単純に保持したい場合があります(のようなものrecLength += currentBuffer.length)。次に、サンプルの総数をサンプルレートで割ることにより、長さを決定できます。サンプルレートは、を介して決定できますcontext.sampleRate

適切なパラメータを使用して新しいAudioBufferオブジェクトを作成したら、保存した配列(recorded配列)をAudioBufferのチャネルデータ配列にコピーするだけです。これは非常に単純な2ステップのプロセスです。

  1. AudioBufferのgetChannelData(channel)メソッドを介して基になるチャネルデータを取得します
  2. 配列を反復recorded処理し、保存したデータをメソッドを介してチャネルデータ配列にコピーします.set(array, offset)(詳細については、MDN Float32Arrayのドキュメントを参照してください)。コードは、格納されている各配列の長さだけ増加すると、次のようになりますchannelData.set(currArray, currOffset)currOffset

注: 2チャンネルのオーディオを録音する場合は、録音されたサンプルの2つの配列があり、各チャンネル(0と1)に対して上記の2つの手順を実行し、対応する配列をコピーする必要があります。

正しく実行されると、AudioBufferが作成され、AudioBufferSourceNodeにスロットインして、必要に応じて再生できます。

于 2012-10-31T18:29:02.683 に答える