恢复后,为什么状态在Safari的Web Audio中可能无效?

时间:2018-11-01 11:08:21

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

我有一个播放从S3下载的音频文件的代码。用户在页面上看到带有图片和单词的轮播,他应该发音并听到正确发音的音频。问题出在Safari中,它会在窗口加载时阻止音频文件的自动播放。我知道Safari默认情况下会自动播放,并在设置自动播放:停止带声音的媒体中启用。当我转到该页面时,Safari会阻止音频文件的自动播放,并且页面会停止加载并“冻结” ,并且如果要呼叫恢复, AudioContext状态为“已暂停” ()例如,在用户执行的任何操作上,单击文档,状态都将变为“正在运行”,,但是如果我单击下一张幻灯片,则下一个功能将调用 source.stop()来停止音频如果正在播放音频,则播放源为 bufferSource(AudioContext.createBufferSource()),并且抛出错误'InvalidStateError' https://3v4l.org/aj0Ln

为什么会发生此错误?如果状态为“运行中”而不是“暂停”。当然,当然还有3个按钮可以再次播放音频,录制音频并播放录制的音频,然后恢复所有工作,但是当停止功能调用时显示错误。

2 个答案:

答案 0 :(得分:1)

Safari会由于多种原因引发该错误,包括以下原因:

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

答案 1 :(得分:0)

如果您在使用"InvalidStateError: The object is in an invalid state时在Safari中(或其他带有不同消息的浏览器中)看到AudioBufferSourceNodes,则可能是因为您在某个计算机上调用了stop()start()完成播放的节点。

引用from MDN

  

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