AudioWorkletProcessor

基线 广泛可用

此功能已十分成熟,可以在多种设备和浏览器版本上运行。它自以下时间起已在各个浏览器中提供 2021 年 4 月.

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

构造函数

注意: AudioWorkletProcessor 及其派生类不能直接从用户提供的代码实例化。相反,它们仅在创建关联的 AudioWorkletNode 时由内部创建。派生类的构造函数将使用一个选项对象调用,因此您可以执行自定义初始化过程——有关详细信息,请参阅构造函数页面。

AudioWorkletProcessor()

创建一个新的 AudioWorkletProcessor 对象实例。

实例属性

port 只读

返回一个 MessagePort,用于在处理器与其所属的 AudioWorkletNode 之间进行双向通信。另一端在节点的 port 属性下可用。

实例方法

AudioWorkletProcessor 接口本身没有定义任何方法。但是,您必须提供一个 process() 方法,该方法用于处理音频流。

事件

AudioWorkletProcessor 接口不响应任何事件。

使用注意事项

派生类

要定义自定义音频处理代码,您必须从 AudioWorkletProcessor 接口派生一个类。尽管未在接口中定义,但派生类必须具有 process 方法。此方法将针对每块 128 个样本帧调用,并使用输入和输出数组以及自定义 AudioParam 的计算值(如果定义了这些值)作为参数。您可以使用输入和音频参数值来填充输出数组,该数组默认情况下包含静音。

如果您希望在节点上使用自定义 AudioParam,则可以选择提供一个 parameterDescriptors 属性作为处理器的静态获取器。返回的基于 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 音频 API
# AudioWorkletProcessor

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅