网络音频 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中的数据。 (我不想改变输出音频,只是处理并给出一个数字) 我怎样才能做到这一点?有更好的方法吗?

您可以使用 AudioWorkletProcessorport 将数据发送回主线程(或任何其他线程)。

this.port.postMessage(someProcessedNumber);

每个 AudioWorkletNode 都有一个 port 也可以用来接收消息。

使用 MessagePort 会在音频线程上产生一些垃圾,这使得垃圾收集不时 运行。它也不是传输数据的最佳方式。

如果这是一个问题,您可以使用 SharedArrayBuffer 而不是 AudioWorkletProcessor 用于写入数据而 AudioWorkletNode 用于读取数据。

ringbuf.js 是一个旨在使这个过程尽可能简单的库。