我通过以编程方式填写AudioBuffer
来创建1s音频片段。 AudioBufferSourceNode
已启用循环。它在Chrome和Firefox中播放得很好。
现在我想动态更新AudioBuffer并立即(或在下一个循环中)拾取新音频。在Chrome中,通过简单地获取频道数据(getChannelData(0)
)并写入它就可以完美地工作。 Chrome会即时更新播放音频。 Firefox一遍又一遍地播放原始缓冲区。实际上在Firefox中,AudioBuffer
需要在将其分配给AudioBufferSourceNode
(source.buffer = buffer
)之前编写。
答案 0 :(得分:3)
这不应该这样做。您正在尝试跨线程边界更新对象。
Chrome有一个错误,我们目前没有实现内存保护(即您可以更新AudioBuffer的内容,它将改变循环缓冲区的声音)。 FF目前有一个不同的bug,它允许你不止一次设置.buffer。这些都应该得到解决。
要解决这种情况,你需要循环每个缓冲区,直到你得到下一个缓冲区,然后在它们之间交叉淡入淡出。不太可能只是循环1s缓冲区真的是你想要的吗? (除非它是噪音。)
答案 1 :(得分:0)
只需再次分配相同的缓冲区即可更新Firefox的内部状态。所以在更新缓冲区后再次执行source.buffer = buffer
。即使它应该是NOOP,因为它是完全相同的参考。
即使source.buffer = source.buffer
也可以。