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

浏览器兼容性

另见