正在动态写入的 Web 音频链接缓冲区

Web Audio- Chaining buffers that are being dynamically written

这是对我之前的问题 的扩展,但我觉得这是一个足够独立的问题,需要一个新线程。

我基本上是在尝试使用网络音频进行双缓冲 API 以使音频以低延迟播放。基本思想是我们有 2 个缓冲区。一个写一个播放,一个一个播放,来回播放,形成连续的音频。

只要缓冲区大小足够大,上一个线程中的解决方案就可以很好地工作,但延迟会受到一些影响,因为我最终能够使用的最小缓冲区大约有 4000 个样本长,在我选择的 44.1k 采样率下,大约有 90 毫秒的延迟。

我从之前的回答了解到问题出在 onended 事件的使用上,有人建议使用 ScriptProcessorNode 可能更好。但是,据我了解,ScriptProcessorNode 有自己的特定大小的内置缓冲区,只要节点接收到音频,您就可以访问它,并且您可以在构造函数中确定它:

var scriptNode = context.createScriptProcessor(4096, 2, 2); // buffer size, channels in, channels out

我最初一直在使用两个交替的源缓冲区。有没有办法从 ScriptProcessorNode 访问它们,或者我需要改变我的方法?

不,无法在脚本处理器中使用其他缓冲区。今天,您最好的方法是使用脚本处理器并将示例直接写入其中。

请注意,AudioBuffers 的工作方式无法保证您以前的方法不会复制和创建新缓冲区 - 您不能同时从音频线程和主线程访问缓冲区。

将来,使用 audio worker 会好一点——它会避免一些线程跳跃——但如果你(例如)从网络源流式传输缓冲区,你就不会能够避免复制。 (实际上并没有那么昂贵。)如果您要生成音频缓冲区,则应该在 onaudioprocess 中生成它。