网络音频 API 处理器结果
Web Audio API Processor result
我正在用 JS 做一些音频处理,使用 Web Audio API
所以我创建了一个自定义 Audio Worklet Processor,我正在其中处理一些音频。
这是一个小例子。
class MyProcessor extends AudioWorkletProcessor {
process (inputs, outputs, parameters) {
const someProcessedNumber = cppApiProcessor.process(inputs,outputs,parameters);
return true; // to keep the processor alive
}
}
你看到变量 someProcessedNumber
来自 cppApi
我不知道如何让外部 JS 世界知道这一点,因为 Processor
returns boolean
(是否保持节点存活),并且我不能触摸outputs
中的数据。 (我不想改变输出音频,只是处理并给出一个数字)
我怎样才能做到这一点?有更好的方法吗?
您可以使用 AudioWorkletProcessor
的 port
将数据发送回主线程(或任何其他线程)。
this.port.postMessage(someProcessedNumber);
每个 AudioWorkletNode
都有一个 port
也可以用来接收消息。
使用 MessagePort
会在音频线程上产生一些垃圾,这使得垃圾收集不时 运行。它也不是传输数据的最佳方式。
如果这是一个问题,您可以使用 SharedArrayBuffer
而不是 AudioWorkletProcessor
用于写入数据而 AudioWorkletNode
用于读取数据。
ringbuf.js 是一个旨在使这个过程尽可能简单的库。
我正在用 JS 做一些音频处理,使用 Web Audio API 所以我创建了一个自定义 Audio Worklet Processor,我正在其中处理一些音频。
这是一个小例子。
class MyProcessor extends AudioWorkletProcessor {
process (inputs, outputs, parameters) {
const someProcessedNumber = cppApiProcessor.process(inputs,outputs,parameters);
return true; // to keep the processor alive
}
}
你看到变量 someProcessedNumber
来自 cppApi
我不知道如何让外部 JS 世界知道这一点,因为 Processor
returns boolean
(是否保持节点存活),并且我不能触摸outputs
中的数据。 (我不想改变输出音频,只是处理并给出一个数字)
我怎样才能做到这一点?有更好的方法吗?
您可以使用 AudioWorkletProcessor
的 port
将数据发送回主线程(或任何其他线程)。
this.port.postMessage(someProcessedNumber);
每个 AudioWorkletNode
都有一个 port
也可以用来接收消息。
使用 MessagePort
会在音频线程上产生一些垃圾,这使得垃圾收集不时 运行。它也不是传输数据的最佳方式。
如果这是一个问题,您可以使用 SharedArrayBuffer
而不是 AudioWorkletProcessor
用于写入数据而 AudioWorkletNode
用于读取数据。
ringbuf.js 是一个旨在使这个过程尽可能简单的库。