6

私は特にScriptProcessorNodeonaudioprocessに興味があります(最近までJavaScriptNodeと呼ばれていました)。これは、オーディオ処理のために定期的に呼び出されるイベント リスナーです。別のスレッドで実行されますか?

データを循環バッファーにフィードし、このコールバックの外で処理して、CPU を占有しないようにしたいと考えています。非同期処理にWebワーカーを使用できますが、私の知る限り、スレッドが異なる場合はリングバッファーの別の実装が必要です。

これをテストする方法はありますか?

4

2 に答える 2

5

すべての JavaScript はシングルスレッドで、同期的に実行されます。非同期処理はすべて、現在のタスクが終了したときに実行されるハンドラーをタスク キューに追加するイベントを介して行われます。

個別のスレッドを使用するには、WebWorkers のような環境が必要です。すべてのスレッドには、独自の実行コンテキスト (グローバル スコープ) とタスク キューがあります。それらの間の通信は、イベントを介して行われます。

ハンドラーは DOM と同じスコープ内にあるように見えるため、onaudioprocess独自のスレッドで実行される可能性はほとんどありません。ページが応答しなくなる計算負荷の高いタスクが実際にある場合は、オーディオ イベントをフィードする WebWorker を使用する必要があります。

myScriptProcessorNode.onaudioprocess = myWebWorker.postMessage;
于 2012-11-09T00:13:08.620 に答える
1

Bergi のソリューションでは、構造化されたクローン アルゴリズムが audioProcessingEvent の読み取り専用パラメーターをコピーできないという問題が発生します。あなたがする必要があるのは、複製可能なイベントから必要な部分を分割し、次のように別のデータ構造でワーカーに渡すことです。

_onAudioProcess(audioProcessingEvent) {
  const {inputBuffer, outputBuffer} = audioProcessingEvent;
  // The output buffer contains the samples that will be modified and
  // eventually played, so we need to keep a reference to it.
  this._outputBuffer = outputBuffer;
  const numChannels = inputBuffer.numberOfChannels;

  const inputChannels =
    Array.from({length: numChannels}, (i) => {
      return inputBuffer.getChannelData(i);
    });

  this._worker.postMessage({
    command: 'DO_STUFF',
    inputChannels: inputChannels,
  });
}

また、処理されたデータをコピーして最終的にユーザーが再生できるようにするには、setMessageHandler の outputBuffer への参照にアクセスする必要があります。

于 2016-08-04T19:44:02.840 に答える