【问题标题】:Firefox Web Audio API on-the-fly update AudioBuffer / AudioBufferSourceNodeFirefox Web Audio API 即时更新 AudioBuffer / AudioBufferSourceNode
【发布时间】:2015-04-24 23:17:49
【问题描述】:

我正在通过以编程方式填充AudioBuffer 创建一个 1s 音频 sn-p。 AudioBufferSourceNode 已启用循环。它可以在 Chrome 和 Firefox 中正常播放。

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

【问题讨论】:

  • 这看起来像是网络音频规范中未指定的行为。也许指出github.com/WebAudio/web-audio-api/issues 的实现差异并希望每个浏览器最终都做同样的事情?
  • 谢谢,我不知道规范在 GitHub 上。我会参与进来。我一般都喜欢参与新的规格,但我对 90 年代的感觉不感兴趣。

标签: javascript firefox web-audio-api


【解决方案1】:

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

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

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

【讨论】:

  • “除非是噪音”:它是动态生成的盖革计数器随着频率的变化(通过用户交互)敲击。 1s 的反应时间足够快,可以用新的频率(每秒敲击次数)更新缓冲区
  • 嗯。不应该说“噪音”-应该说“非循环波形”,这是合格的。我仍然建议您只保留两个缓冲区,并在它们之间循环,更新您当前未播放的缓冲区。
  • 澄清一下:这意味着不断创建新的AudioBufferSourceNodes 并连接它们,对吧?
  • 每次换出循环,都是的。
【解决方案2】:

再次分配相同的缓冲区将更新 Firefox 的内部状态。所以只需在更新缓冲区后再次执行source.buffer = buffer。即使它应该是 NOOP,因为它是完全相同的引用。

即使source.buffer = source.buffer 也能解决问题。

【讨论】:

  • 请注意,这是 Firefox 实现中的一个错误,因此可能会得到修复。
猜你喜欢
  • 2017-09-25
  • 2018-04-02
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2013-09-25
相关资源
最近更新 更多