Javascript 为什么恢复后Safari中的Web音频中的状态可能无效?

Javascript 为什么恢复后Safari中的Web音频中的状态可能无效?,javascript,audio,safari,web-audio-api,Javascript,Audio,Safari,Web Audio Api,我有一个代码,可以播放从S3下载的音频文件。在页面上,用户可以看到带有图片和单词的旋转木马,并且可以听到发音正确的音频。问题是在Safari中,它会阻止在窗口加载时自动播放音频文件。我知道Safari在默认情况下会阻止自动播放,并且在设置“自动播放:停止有声音的媒体”中已启用。当我进入页面时,Safari会阻止自动播放音频文件,页面停止加载,“freez”和音频上下文状态为“挂起”如果要调用resume(),请在任何用户操作上单击文档,例如,状态更改为“正在运行”,但如果我单击下一张幻灯片,下一

我有一个代码,可以播放从S3下载的音频文件。在页面上,用户可以看到带有图片和单词的旋转木马,并且可以听到发音正确的音频。问题是在Safari中,它会阻止在窗口加载时自动播放音频文件。我知道Safari在默认情况下会阻止自动播放,并且在设置“自动播放:停止有声音的媒体”中已启用。当我进入页面时,Safari会阻止自动播放音频文件,页面停止加载,“freez”和音频上下文状态为“挂起”如果要调用resume(),请在任何用户操作上单击文档,例如,状态更改为“正在运行”,但如果我单击下一张幻灯片,下一个函数将调用source.stop()停止音频播放如果正在播放音频,则该源是缓冲源(AudioContext.createBufferSource()),并抛出错误“InvalidStateError”

为什么会发生此错误?如果状态为“正在运行”而不是“已挂起”。同样在coursel eXiste 3按钮中,再次播放音频、录制音频和播放录制的音频,然后恢复所有工作,但当停止功能调用显示的错误时。

如果您看到
“InvalidStateError:对象在Safari中处于无效状态
(或在具有不同消息的其他浏览器中)使用
AudioBufferSourceNodes
时,很可能是因为您在已完成播放的节点上调用了
stop()
start()

引述:

AudioBufferSourceNode只能播放一次;每次调用start()后,如果要再次播放相同的声音,必须创建一个新节点。幸运的是,这些节点的创建成本非常低,并且实际的AudioBuffers可以重复用于多个声音播放。事实上,您可以在“开火并忘记”中使用这些节点方式:创建节点,调用start()开始播放声音,甚至不用保存对它的引用。它将在适当的时间自动进行垃圾收集,直到声音播放完毕后的某个时间


Safari将抛出该错误,原因有多种,包括:

  • 对尚未开始播放的项目调用
    stop()
    。这可能是你的问题
  • 告诉它在无效时间停止,例如
    stop(0)
    而不是
    stop(ctx.currentTime)