我对 ScriptProcessorNode 的 onaudioprocess 特别感兴趣(直到最近才称为 JavaScriptNode )。它是一个事件监听器,定期调用它进行音频处理。它是在单独的线程中运行的吗?
我想将数据提供给循环缓冲区并在此回调之外处理它,这样我就不会占用CPU了。我可以使用Web worker进行异步处理,但AFAIK在不同线程的情况下我需要不同的环形缓冲区实现。
有没有办法测试这个?
答案 0 :(得分:0)
使用Bergi的解决方案,您将遇到structured clone algorithm无法复制audioProcessingEvent中的只读参数的问题。您需要做的是从可克隆的事件中分离出您需要的部分,并将它们传递给您的工作者,使用不同的数据结构,如下所示:
_onAudioProcess(audioProcessingEvent) {
const {inputBuffer, outputBuffer} = audioProcessingEvent;
// The output buffer contains the samples that will be modified and
// eventually played, so we need to keep a reference to it.
this._outputBuffer = outputBuffer;
const numChannels = inputBuffer.numberOfChannels;
const inputChannels =
Array.from({length: numChannels}, (i) => {
return inputBuffer.getChannelData(i);
});
this._worker.postMessage({
command: 'DO_STUFF',
inputChannels: inputChannels,
});
}
您还需要访问setMessageHandler中对outputBuffer的引用,以便将处理后的数据复制回最终由用户播放。