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 缓冲区不太可能真的是你想要的吗? (除非是噪音。)
我正在通过编程方式填充 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 缓冲区不太可能真的是你想要的吗? (除非是噪音。)