我有时试图在特定偏移处开始播放缓冲区。我有一个这样创建的对象:
var directSource = AudioContext.createBufferSource();
稍后,在初始化之后,我致电:
directSource.start();
在所有浏览器上都适用。
用户可以跳来跳去,所以我可能会停止声音,然后重新初始化所有内容(它运行的代码与第一次完全相同,只是传递了偏移量),然后调用以:
directSource.start(0, offset);
这适用于Chrome和Firefox,但该行会在MacBookPro和iPhone上的Safari上导致InvalidStateError
。
如果我将该行替换为:
directSource.start();
然后我没有收到错误消息。
我测试了AudioContext,它肯定处于“运行”状态。
我在致电console.log()
之前放了start()
,以确保我不会无意间两次打电话。
任何人都可以帮助诊断Safari无法从偏移开始的原因吗?在其他地方,我可以寻找不满意之处的线索。
谢谢!
答案 0 :(得分:1)
我认为您遇到的问题是在这种情况下Safari非常挑剔。 offset参数必须小于或等于Safari中AudioBuffer的持续时间。
Web Audio规范说“偏移量被静默地钳制到[0,duration]”。 (https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-start-when-offset-duration-offset)但是Safari却抛出错误。
您可以通过确保自己固定值来避免这种情况。
bufferSource.start(
0,
Math.min(bufferSource.buffer.duration, offset)
);
我是一个名为standardized-audio-context的软件包的作者。它尚未解决,但我已经为此创建了一个issue。该软件包的目标是提供AudioContext
的版本,该版本在每个浏览器中的工作原理几乎都相同,当然也应处理该小错误。