Firefox Web Audio API 即时更新 AudioBuffer / AudioBufferSourceNode

Firefox Web Audio API on-the-fly update AudioBuffer / AudioBufferSourceNode

我正在通过编程方式填充 AudioBuffer 创建一个 1 秒的音频片段。 AudioBufferSourceNode 已启用循环。它在 Chrome 和 Firefox 中播放得很好。

现在我想动态更新 AudioBuffer 并立即(或在下一个循环中)拾取新音频。在 Chrome 中,只需获取通道数据 (getChannelData(0)) 并写入即可完美运行。 Chrome 即时更新正在播放的音频。 Firefox 一遍又一遍地播放原始缓冲区。事实上,在 Firefox 中,需要在将 AudioBuffer 分配给 AudioBufferSourceNode (source.buffer = buffer) 之前写入 AudioBuffer

只需再次分配相同的缓冲区即可更新 Firefox 的内部状态。因此,只需在更新缓冲区后再次执行 source.buffer = buffer 即可。尽管它应该是一个 NOOP,因为它是完全相同的参考。

甚至 source.buffer = source.buffer 也能做到这一点。

不应该这样做。您正在尝试跨线程边界更新对象。

Chrome 有一个错误,我们目前没有实现内存保护(即您可以更新 AudioBuffer 的内容,它会改变循环缓冲区的声音)。 FF 目前有一个不同的错误,它允许您多次设置 .buffer。这些都应该得到修复。

为了解决这种情况,您需要循环每个缓冲区,直到获得下一个缓冲区,然后在它们之间交叉淡入淡出。无论如何,循环 1s 缓冲区不太可能真的是你想要的吗? (除非是噪音。)