AudioWorkletProcessor - 表示自定义 AudioWorkletNode 后面的音频处理代码

AudioWorkletProcessorWeb Audio API 的接口,表示自定义 AudioWorkletNode 后面的音频处理代码。它位于 AudioWorkletGlobalScope 中,并在 Web Audio 渲染线程上运行。反过来,基于它的 AudioWorkletNode 在主线程上运行。

构造函数

无法从用户提供的代码直接实例化 AudioWorkletProcessor 及其派生类。相反,它们只能通过创建关联的 AudioWorkletNode 来内部创建。派生类的构造函数将通过 options 对象调用,因此您可以执行自定义初始化过程 - 有关详细信息,请参见构造函数页面。

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,它将输出白噪声,并将其注册。请注意,这应该在单独的文件中完成。

// 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 的实例,将其传递给处理器名称,然后将该节点连接到音频图。

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 的定义
工作草案 -

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持64≤79 未知 未知 未知 未知
AudioWorkletProcessor() 构造函数64≤79 未知 未知 未知 未知
port64≤79 未知 未知 未知 未知

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持6464 未知 未知 未知 未知 未知
AudioWorkletProcessor() 构造函数6464 未知 未知 未知 未知 未知
port6464 未知 未知 未知 未知 未知