javascript - AudioBufferSourceNode.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 不能从偏移量开始?还有其他地方我可以寻找关于它不喜欢什么的线索。
谢谢!
解决方案
我认为您遇到的问题是 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
它在每个浏览器中的工作方式几乎相同,这个小错误肯定也应该被处理。
推荐阅读
- node.js - npm install 的完整性在不同的环境下是不同的(windows vs linux)
- c# - 在单元测试中使用泛型的中介起订量
- java - 我正在尝试从广播接收器发出 API 请求,任何人都可以提及正确的方法吗?
- mysql - MySQL选择总和小于值的日期范围
- sql-server - ROLLBACK 使 INSERTED 表中的数据在 AFTER INSERT TRIGGER 中删除
- firebase - 如何在flutter中从firestore打印值
- php - 循环外的php计数变量被重置
- c# - 在中心条目 Xamarin 中时将插入符号移动到占位符的开头
- mysql - Laravel 运行时错误:无效请求(远程主机强制关闭现有连接)
- xamarin.android - 尝试将 admob 添加到项目时出错