AudioWorkletProcessor: process() 方法

process() 方法是 AudioWorkletProcessor 派生類中用於實現音訊處理器工作單元的音訊處理演算法的方法。

雖然此方法並非 AudioWorkletProcessor 介面的一部分,但任何 AudioWorkletProcessor 的實現都必須提供一個 process() 方法。

該方法由音訊渲染執行緒同步呼叫,每次處理定向透過處理器相應 AudioWorkletNode 的一個音訊塊(也稱為渲染量)。換句話說,每當有一個新的音訊塊準備好供您的處理器進行操作時,您的 process() 函式就會被呼叫。

注意: 目前,音訊資料塊始終是 128 幀長 — 即,它們包含每個輸入通道的 128 個 32 位浮點樣本。但是,已有計劃修訂規範,允許根據具體情況更改音訊塊的大小(例如,如果音訊硬體或 CPU 利用率在使用更大塊大小時更有效)。因此,您必須始終檢查樣本陣列的大小,而不是假設特定的固定大小。

此大小甚至可能隨時間而改變,因此您不能僅檢視第一個塊並假設樣本緩衝區的大小始終相同。

語法

js
process(inputs, outputs, parameters)

引數

inputs

連線到節點的輸入陣列,其中每一項又是一個通道陣列。每個通道都是一個包含 128 個樣本的 Float32Array。例如,inputs[n][m][i] 將訪問第 n 個輸入、該輸入的第 m 個通道以及該通道的第 i 個樣本。

每個樣本值都在 [-1 .. 1] 範圍內。

輸入的數量(因此該陣列的長度)在節點構造時是固定的(請參閱 AudioWorkletNode)。如果沒有任何活動的節點連線到節點的第 n 個輸入,則 inputs[n] 將是一個空陣列(可用輸入通道數為零)。

每個輸入中的通道數量可能因 channelCountchannelCountMode 屬性而異。

outputs

一個輸出陣列,其結構與 inputs 引數類似。它旨在在 process() 方法執行期間進行填充。預設情況下,每個輸出通道都填充為零 — 除非修改了輸出陣列,否則處理器將輸出靜音。

parameters

包含字串鍵和 Float32Array 值的物件。對於使用 parameterDescriptors getter 定義的每個自定義 AudioParam,物件中的鍵是該 AudioParamname,值是 Float32Array。陣列的值是透過考慮計劃的自動化事件計算得出的。

如果引數的自動化速率為 "a-rate",則陣列將包含 128 個值 — 每個值對應當前音訊塊中的一幀。如果在當前塊表示的時間段內沒有發生自動化,則陣列可能包含一個在整個塊中恆定的單個值,而不是 128 個相同的 128 個值。

如果自動化速率為 "k-rate",則陣列將包含一個值,該值將用於 128 幀中的每一幀。

返回值

一個布林值,指示是否強制 AudioWorkletNode 保持活動狀態,即使使用者代理的內部邏輯否則會決定關閉該節點是安全的。

返回值允許您的處理器影響 AudioWorkletProcessor 及其所屬節點的生命週期策略。如果返回值與節點的狀態組合導致瀏覽器決定停止該節點,則 process() 將不再被呼叫。

返回 true 會強制 Web Audio API 保持節點活動狀態,而返回 false 則允許瀏覽器在節點既不生成新音訊資料也不接收透過其輸入處理的資料時終止該節點。

最常見的 3 種音訊節點型別是:

  1. 輸出源。實現此類節點的 AudioWorkletProcessor 應在生成輸出時從 process 方法返回 true。一旦已知它不再生成輸出,該方法就應返回 false。例如,以 AudioBufferSourceNode 為例 — 此類節點的後臺處理器在緩衝區播放時應從 process 方法返回 true,並在緩衝區播放結束時(無法再次呼叫同一個 AudioBufferSourceNodeplay 方法)開始返回 false
  2. 轉換輸入的節點。實現此類節點的處理器應從 process 方法返回 false,以允許活動輸入節點和對該節點的引用決定它是否可以被垃圾回收。具有此行為的節點示例是 GainNode。一旦沒有連線輸入並且沒有保留引用,增益就無法再應用於任何內容,因此可以安全地進行垃圾回收。
  3. 轉換輸入但具有所謂的尾部時間(tail-time)的節點 — 這意味著即使在輸入斷開連線或不活動(生成零通道)之後,它仍會產生一段時間的輸出。實現此類節點的處理器應在尾部時間期間從 process 方法返回 true,該時間從輸入為空(零通道)開始。此類節點的示例是 DelayNode — 它的尾部時間等於其 delayTime 屬性。

注意: 缺少 return 語句意味著該方法返回 undefined,由於這是一個假值,所以相當於返回 false。省略顯式的 return 語句可能會導致難以發現的節點問題。

異常

由於 process() 方法由使用者實現,因此它可能丟擲任何異常。如果丟擲未捕獲的錯誤,節點將發出 processorerror 事件,並在其剩餘生命週期內輸出靜音。

示例

在此示例中,我們建立了一個 AudioWorkletProcessor,它向其第一個輸出產生白噪聲。增益可以透過 customGain 引數進行控制。

js
class WhiteNoiseProcessor extends AudioWorkletProcessor {
  process(inputs, outputs, parameters) {
    // take the first output
    const output = outputs[0];
    // fill each channel with random values multiplied by gain
    output.forEach((channel) => {
      for (let i = 0; i < channel.length; i++) {
        // generate random value for each sample
        // Math.random range is [0; 1); we need [-1; 1]
        // this won't include exact 1 but is fine for now for simplicity
        channel[i] =
          (Math.random() * 2 - 1) *
          // the array can contain 1 or 128 values
          // depending on if the automation is present
          // and if the automation rate is k-rate or a-rate
          (parameters["customGain"].length > 1
            ? parameters["customGain"][i]
            : parameters["customGain"][0]);
      }
    });
    // as this is a source node which generates its own output,
    // we return true so it won't accidentally get garbage-collected
    // if we don't have any references to it in the main thread
    return true;
  }
  // define the customGain parameter used in process method
  static get parameterDescriptors() {
    return [
      {
        name: "customGain",
        defaultValue: 1,
        minValue: 0,
        maxValue: 1,
        automationRate: "a-rate",
      },
    ];
  }
}

規範

規範
Web Audio API
# process

瀏覽器相容性

這不是瀏覽器提供的函式,而是必須在客戶端程式碼中編寫的回撥函式。

另見