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 | 未知 | 未知 | 未知 | 未知 | 未知 |