微信小程序 innerAudioContext.onTimeUpdate不触发

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

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

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()
        },
}

 

posted @ 2023-12-20 17:17  土小狗  阅读(210)  评论(0编辑  收藏  举报