The play() request was interrupted by ……
发布于 7 年前 作者 vhou 770 次浏览 来自 问答

纠结这个问题好久了,几乎就是仿照例子来的。

先点播放,再点暂停,就会报错。

只有第一次会报,第二次再播放-暂停就不会了。

请问这是为什么呀?

4 回复

谢谢回复!

那就是说 ,audio.pause() 和设置新的src audio.src = ‘newmusic.mp3’ ,任意一个都会打断音频加载。

应该没错吧?

  1. 是的,主要问题就是 pause 和 audio.src 打断了音频的加载,如果音频已经加载至可以开始播放,那么不会抛出此错误

  2. 虽不太准确,但可以这么理解

  3. audio.pause()没有返回值,暂停播放是立即执行的。因为是暂停播放,所以不涉及资源的加载,因此没有”被打断“的问题。

感谢感谢!大概懂了……

那是不是可以认为:

1、只要音频加载速度够快,后者在play和pause之间等够足够的时间,就可以避免报错呢?

(事实上我点play后隔了好几秒再点的pause,不过这里网速也是够慢的,因此我也并不确定点击pause时音频是否有加载成功)

2、第二次点“播放-暂停”不报错,是不是因为缓存里已经有了音频,因此跳过promise阶段?3、我的小程序只是简单“播放-暂停”,还没有涉及src audio.src = ‘newmusic.mp3’ ,请问是 audio.pause()执行时会有这个步骤吗?

这个问题可以参考 https://developers.google.com/web/updates/2017/06/play-request-was-interrupted

audio 组件在内部是用 HTML5 audio 实现的。audio.play() 方法调用后并不会立即使音频播放,而是会加载音频资源并返回一个 Promise,在资源加载到可以开始播放的时候才开始真正播放音频并将 Promise 的状态变为 fullfilled。而这一行为会被 audio.pause() 以及设置新的src audio.src = ‘newmusic.mp3’ 打断,使 Promise 的状态变为 rejected,此时会抛出一个错误。

这个问题我们正在跟进中,会在之后的版本给出一个解决方案以避免此类问题。

回到顶部