首页 > 解决方案 > Audio​Buffer​Source​Node​.start() 仅在以偏移量启动时在 Safari 上失败

问题描述

我有时会尝试以特定偏移量开始播放缓冲区。我有一个像这样创建的对象:

var directSource = AudioContext.createBufferSource();

稍后,在初始化它之后,我调用:

directSource.start();

这适用于所有浏览器。

用户可以跳过,所以我可能会停止那个声音,并重新初始化所有东西(它运行与第一次完全相同的代码,除了它传递了一个偏移量)并调用 start :

directSource.start(0, offset);

这适用于 Chrome 和 Firefox,但该特定行会InvalidStateError在我的 MacBookPro 和 iPhone 上导致 Safari 上出现问题。

如果我将该行替换为:

directSource.start();

然后我没有得到错误。

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

console.log()在调用之前放了一个start(),以确保我不会无意中调用它两次。

谁能帮助诊断为什么 Safari 不能从偏移量开始?还有其他地方我可以寻找关于它不喜欢什么的线索。

谢谢!

标签: javascriptweb-audio-api

解决方案


我认为您遇到的问题是 Safari 在这种情况下非常挑剔。offset 参数需要小于或等于 Safari 中 AudioBuffer 的时长。

网络音频规范说“偏移量被默默地限制在 [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的包的作者。它还没有解决这个问题,但我已经为它创建了一个问题。这个包的目标是提供一个版本,AudioContext它在每个浏览器中的工作方式几乎相同,这个小错误肯定也应该被处理。


推荐阅读