首页 > 解决方案 > Web Audio Api,实时更新循环缓冲区数据,在 Firefox 中不可能?

问题描述

在播放循环缓冲区时尝试更改底层缓冲区数据时遇到问题。

bufferData = audioContext.bufferSourceNode.buffer.getChannelData(0);
bufferData[100] = newValue;

这种行为似乎在大多数浏览器中都能正常工作——我已经在 Chrome、Safari、Opera、Edge 中进行了测试,一切正常——但这在 Firefox 中似乎是不可能的。这似乎是一个错误。我在2015 年的这个 StackOverflow 问题中读到,这种更新缓冲区的方式“不应该以这种方式完成……”这种事情应该如何在 Firefox 中实现?

尝试的解决方法:

tempBufferData = bufferSourceNode.buffer.getChannelData(0);
bufferSourceNode.stop();
bufferSourceNode.disconnect();
buffer = audioContext.createNewBuffer();
tempBufferData[10] = newValue;
buffer.copyToChannel(tempBufferData);
bufferSourceNode.buffer = buffer;
bufferSourceNode.connect(gainNode);
bufferSourceNode.start(audioContext.currentTime);

停止当前缓冲区,断开连接,创建新的bufferSourceNode和新的缓冲区,每次更新缓冲区重新连接节点的方法感觉很繁琐。到目前为止,在我对该方法的测试中,引入了很多故障/弹出。有没有一种改进的方法来做到这一点?

这是需要这种更新缓冲区的具体示例:一个演示,您可以在其中绘制一个循环的波形,每次更改绘图时都会更新。似乎除了在Firefox中工作。

标签: firefoxweb-audio-api

解决方案


我认为这不是您希望的答案,因为这将是相当多的额外工作,但我认为您在 Firefox 中“应该”这样做的方式(即网络音频 API 规范的方式)对于这些类型的任务)是使用 AudioWorklet。

https://developer.mozilla.org/en-US/docs/Web/API/AudioWorklet


推荐阅读