音频缓冲区源Node.start()仅在以偏移量启动时在Safari上失败

时间:2019-04-17 14:02:48

标签: javascript web-audio web-audio-api

我有时试图在特定偏移处开始播放缓冲区。我有一个这样创建的对象:

var directSource = AudioContext.createBufferSource();

稍后,在初始化之后,我致电:

directSource.start();

在所有浏览器上都适用。

用户可以跳来跳去,所以我可能会停止声音,然后重新初始化所有内容(它运行的代码与第一次完全相同,只是传递了偏移量),然后调用以:

directSource.start(0, offset);

这适用于Chrome和Firefox,但该行会在MacBookPro和iPhone上的Safari上导致InvalidStateError

如果我将该行替换为:

directSource.start();

然后我没有收到错误消息。

我测试了AudioContext,它肯定处于“运行”状态。

我在致电console.log()之前放了start(),以确保我不会无意间两次打电话。

任何人都可以帮助诊断Safari无法从偏移开始的原因吗?在其他地方,我可以寻找不满意之处的线索。

谢谢!

1 个答案:

答案 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的版本,该版本在每个浏览器中的工作原理几乎都相同,当然也应处理该小错误。