AudioWorkletProcessor

Baseline 已廣泛支援

此特性已得到良好支援,可在多種裝置和瀏覽器版本上使用。自 2021 年 4 月起,所有瀏覽器均已支援此特性。

AudioWorkletProcessor 介面是 Web Audio API 的一部分,它代表了自定義 AudioWorkletNode 後面進行音訊處理的程式碼。它存在於 AudioWorkletGlobalScope 中,並在 Web Audio 渲染執行緒上執行。相應地,基於它的 AudioWorkletNode 執行在主執行緒上。

建構函式

注意: AudioWorkletProcessor 及其派生類不能直接從使用者提供的程式碼中例項化。相反,它們只能由關聯的 AudioWorkletNode 建立。派生類的建構函式會接收一個選項物件,因此您可以執行自定義的初始化操作 — 有關詳細資訊,請參閱建構函式頁面。

AudioWorkletProcessor()

建立一個 AudioWorkletProcessor 物件的新的例項。

例項屬性

port 只讀

返回一個 MessagePort,用於處理器與其所屬的 AudioWorkletNode 之間的雙向通訊。另一端可以透過節點的 port 屬性訪問。

例項方法

AudioWorkletProcessor 介面本身不定義任何方法。但是,您必須提供一個 process() 方法,該方法在需要處理音訊流時被呼叫。

事件

AudioWorkletProcessor 介面不響應任何事件。

用法說明

派生類

要定義自定義音訊處理程式碼,您必須從 AudioWorkletProcessor 介面派生一個類。儘管介面中未定義,但派生類必須具有 process 方法。此方法在每個 128 幀的音訊塊被處理時呼叫,並接收輸入和輸出陣列以及自定義 AudioParam(如果定義了)的計算值作為引數。您可以使用輸入和音訊引數值來填充輸出陣列,輸出陣列預設包含靜音。

可選地,如果您希望在節點上擁有自定義 AudioParam,您可以將 parameterDescriptors 屬性作為處理器上的一個靜態 getter 提供。返回的 AudioParamDescriptor 物件陣列將用於在例項化 AudioWorkletNode 時內部建立 AudioParam

生成的 AudioParam 物件位於節點的 parameters 屬性中,可以使用標準方法(如 linearRampToValueAtTime)進行自動化。它們的計算值將作為引數傳遞給處理器的 process() 方法,以便您相應地塑造節點的輸出。

處理音訊

建立自定義音訊處理機制的一個示例演算法是:

  1. 建立一個單獨的檔案;

  2. 在該檔案中

    1. 擴充套件 AudioWorkletProcessor 類(參見 “派生類”部分),並在其中提供您自己的 process() 方法;
    2. 使用 AudioWorkletGlobalScope.registerProcessor() 方法註冊處理器;
  3. 使用音訊上下文的 audioWorklet 屬性上的 addModule() 方法載入該檔案;

  4. 建立一個基於該處理器的 AudioWorkletNode。該處理器將由 AudioWorkletNode 建構函式在內部例項化。

  5. 將節點連線到其他節點。

示例

在下面的示例中,我們將建立一個輸出白噪聲的自定義 AudioWorkletNode

首先,我們需要定義一個輸出白噪聲的自定義 AudioWorkletProcessor 並註冊它。請注意,這應該在一個單獨的檔案中完成。

js
// white-noise-processor.js
class WhiteNoiseProcessor extends AudioWorkletProcessor {
  process(inputs, outputs, parameters) {
    const output = outputs[0];
    output.forEach((channel) => {
      for (let i = 0; i < channel.length; i++) {
        channel[i] = Math.random() * 2 - 1;
      }
    });
    return true;
  }
}

registerProcessor("white-noise-processor", WhiteNoiseProcessor);

接下來,在我們的主指令碼檔案中,我們將載入該處理器,建立一個 AudioWorkletNode 例項(將處理器的名稱傳遞給它),然後將該節點連線到音訊圖。

js
const audioContext = new AudioContext();
await audioContext.audioWorklet.addModule("white-noise-processor.js");
const whiteNoiseNode = new AudioWorkletNode(
  audioContext,
  "white-noise-processor",
);
whiteNoiseNode.connect(audioContext.destination);

規範

規範
Web Audio API
# AudioWorkletProcessor

瀏覽器相容性

另見