我正在尝试了解Web音频GainNode
或AudioBufferSourceNode
可能会导致持续的音频失真,就像音频文件或加载的数据缓冲区损坏一样
仅使用PIXI和咆哮来开发HTML5游戏,并且在Safari和Microsoft Edge中遇到了音频失真。
今天和昨天:阅读HowlerJS code,阅读W3 spec for Web Audio API,并运行许多受控测试。
游戏具有BGM循环,并且在游戏事件中播放许多半秒至几秒的声音效果,有时效果非常快。另外,无关紧要的是,BGM会定期暂停和恢复。
当前统计数据:
- 自然运行游戏。在数十种测试中,音频在Safari中大约在7分钟左右开始出现失真,正负1分钟开始出现失真。在许多测试中,以前在Edge中进行3分钟正负30秒,但在进行更多测试和(显然与音频无关)优化之后,Edge中的测试现在也要在失真发生前约7分钟运行。
- 测试源数据损坏:
- 当当前的BGM通过失真的GainNode播放时,.play()使用相同的cache [key]数据源在Howl对象上创建一个新的GainNode,同时以失真的声音播放。
- 稍后,使用ID暂停/恢复每个声音,从相同源数据中新建的GainNode可以完美播放。这个问题也可能在AudioBufferSourceNode中,但我无法确定。
- 名为Howler.masterGain的GainNode保持不变。
- 所有音频文件均为44100,正在台式机上进行测试。
- 在Safari中,如果我将另一个窗口拖到Safari窗口上方50-90%的位置,循环失真的音频将变得清晰,这使我离开了一段时间。
- 该问题会定期在Safari和Edge中触发,但从未在Chrome中看到过。
所以我想知道是否有一个内部缓冲区,缓冲区数据被复制到该缓冲区,并且该缓冲区已损坏,甚至是碎片化,但是我已经没有足够的想法了。
这是处理Web Audio的已知问题,是否可以解决?