AudioWorkletProcessor - 表示自定义 AudioWorkletNode 后面的音频处理代码
AudioWorkletProcessor 是 Web 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() 方法中,以便您相应地调整节点输出。
处理音频
创建自定义音频处理机制的实例算法为:
- 创建一个单独的文件;
- 在文件中:
- 扩展
AudioWorkletProcessor类(请参见“派生类” 章节),并在其中提供自己的process()方法; - 使用
AudioWorkletGlobalScope.registerProcessor()方法注册处理器;
- 扩展
- 在您的音频上下文的
audioWorklet属性上使用addModule()方法加载文件; - 根据处理器创建一个
AudioWorkletNode。处理器将由AudioWorkletNode构造函数在内部实例化。 - 将节点连接到其他节点。
实例
在这个例子中,我们创建了一个自定义的 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 的定义 |
工作草案 | - |
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基础支持 | 64 | ≤79 | 未知 | 未知 | 未知 | 未知 |
AudioWorkletProcessor() 构造函数 | 64 | ≤79 | 未知 | 未知 | 未知 | 未知 |
port | 64 | ≤79 | 未知 | 未知 | 未知 | 未知 |
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
|---|---|---|---|---|---|---|---|
| 基础支持 | 64 | 64 | 未知 | 未知 | 未知 | 未知 | 未知 |
AudioWorkletProcessor() 构造函数 | 64 | 64 | 未知 | 未知 | 未知 | 未知 | 未知 |
port | 64 | 64 | 未知 | 未知 | 未知 | 未知 | 未知 |