我正在用JS做一些音频处理,使用Web音频API,所以我创建了一个自定义的音频Worklet处理器,其中我正在处理一些音频。
下面是一个小例子。
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返回boolean (不管是否保持节点活动),而且我不能在outputs中访问数据。(我不想改变输出的音频,只要处理并给出一个数字)我怎么能做到呢?有更好的方法吗?
发布于 2022-01-11 16:19:57
您可以使用port的AudioWorkletProcessor将数据发送回主线程(或任何其他线程)。
this.port.postMessage(someProcessedNumber);每个AudioWorkletNode都有一个port,可以用来接收消息。
使用MessagePort将在音频线程上生成一些垃圾,这会使垃圾收集不时运行。它也不是传输数据的最有效的方式。
如果这是一个问题,您可以使用SharedArrayBuffer代替,AudioWorkletProcessor用来写数据,AudioWorkletNode用来读取数据。
ringbuf.js是一个旨在使这个过程尽可能简单的库。
https://stackoverflow.com/questions/70668787
复制相似问题