微信小程序 innerAudioContext.onTimeUpdate不触发

818 阅读1分钟

【也不知道为什么,发出来的代码就被折叠了,大家复制出来放到代码编辑器里看吧。】

最近在开发一个小功能,需要播放音频,音频需要循环播放,代码如下:

onReady() { 
   const audio = wx.createInnerAudioContext()  
  audio.src =      'http://downsc.chinaz.net/Files/DownLoad/sound1/201906/11582.mp3'    audio.loop = true    audio.onPlay(() => {      console.log('audio play start')    })    audio.onTimeUpdate(() => {      console.log('audio info', audio.duration, audio.currentTime)    })    audio.play()  },

上面这段代码执行之后,onTimeUpdate里的log没有输出到控制台上。

查询之后发现,在官方社区里,有许多关于onTimeUpdate的问题。

由于音频加载导致 onUpdateTime 失效

由此,小改动一下代码, 将play放到onCanPlay事件里去执行,就可以了。

audio.onCanPlay(()=>{
    audio.play()
})

经过改动以后,我们会发现在第一轮播放完毕之后,onTimeUpdate之后就不再执行了。

原因分析,第二轮播放onTimeUpdate出现问题应该和之前分析的类似。第二次播放在JS引擎里也需要一个准备时间,但在loop模式下,第二轮的准备时间没准备好,就触发了音频播放,导致onTimeUpdate没能成功触发。

解决第二轮播放,执行onTimeUpdate的方式为:

1. loop 改为false

2. 添加onEnded事件监听,在onEnded事件, 先将播放进度设置回0, 再执行一下播放代码。通过再次播放,实现视频循环播放的功能。

最终调整后的代码如下:

{
  onReady() {    const audio = wx.createInnerAudioContext()    audio.src =      'http://downsc.chinaz.net/Files/DownLoad/sound1/201906/11582.mp3'    audio.loop = true    audio.onPlay(() => {      console.log('audio play start')    })    audio.onTimeUpdate(() => {      console.log('audio info', audio.duration, audio.currentTime)    })    audio.onEnded(() => {      audio.seek(0)      audio.onCanplay(() => {        audio.play()      })    })    this.audio = audio  },
  playaudio() {    this.audio.play()  },}

多说一句: 微信小程序里这种小bug真多,又长时间不解决。

参考资料:

developers.weixin.qq.com/community/d…