使用uni-app背景音频播放音频,使用seek设置快进播放,多次频繁设置时,有时音频时间还没有播放结束,但是会触发onEnded背景音频自然播放结束事件

使用uni-app背景音频播放音频,使用seek设置快进播放,多次频繁设置时,有时音频时间还没有播放结束,但是会触发onEnded背景音频自然播放结束事件

开发环境 版本号 项目创建方式
Windows 11 家庭中文版 26100.4349 HBuilderX
## 示例代码:


```javascript
bgAudioMannager.seek(parseInt(seekTime));// 设置快进时间  
bgAudioMannager.onEnded(() => {  
    console.log('背景音频自然播放结束事件', bgAudioMannager.currentTime)  
    that.next()  
})

操作步骤:

使用uni.getBackgroundAudioManager()背景音频播放音频,使用seek设置快进播放,多次频繁设置快进时间时

预期结果:

正常快进播放音频,直到音频播放时间结束

实际结果:

有时候音频时间还没有播放结束,但是会触发onEnded背景音频自然播放结束事件,导致触发这个时间中的自定义的播放下一曲事件

bug描述:

【报Bug】使用uni.getBackgroundAudioManager()背景音频播放音频,使用seek设置快进播放,多次频繁设置快进时间时,有时候音频时间还没有播放结束,但是会触发onEnded背景音频自然播放结束事件,导致触发这个时间中的自定义的播放下一曲事件


更多关于使用uni-app背景音频播放音频,使用seek设置快进播放,多次频繁设置时,有时音频时间还没有播放结束,但是会触发onEnded背景音频自然播放结束事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于使用uni-app背景音频播放音频,使用seek设置快进播放,多次频繁设置时,有时音频时间还没有播放结束,但是会触发onEnded背景音频自然播放结束事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的 uni-app 背景音频管理器的时序问题。当频繁调用 seek() 方法时,音频播放器的内部状态可能出现混乱,错误地触发了 onEnded 事件。

问题原因分析:

  1. seek() 操作是异步的,频繁调用可能导致多个 seek 请求在播放器内部队列中竞争执行
  2. 播放器在 seek 过程中可能短暂地将当前时间设置为接近音频总时长的位置
  3. 底层音频引擎在快速跳转时可能误判播放已到达结尾

解决方案:

  1. 防抖处理:对 seek 操作添加防抖,避免频繁调用
let seekTimer = null
function seekAudio(time) {
    clearTimeout(seekTimer)
    seekTimer = setTimeout(() => {
        bgAudioMannager.seek(parseInt(time))
    }, 300)
}
  1. 状态检查:在 onEnded 回调中增加验证逻辑
bgAudioMannager.onEnded(() => {
    // 验证当前时间是否真的接近音频总时长
    if (Math.abs(bgAudioMannager.currentTime - bgAudioMannager.duration) < 1) {
        console.log('背景音频自然播放结束')
        that.next()
    }
})
  1. 使用播放状态监控:结合 onTimeUpdate 来准确判断播放状态
let isSeeking = false
bgAudioMannager.onSeeked(() => {
    isSeeking = false
})

function seekAudio(time) {
    isSeeking = true
    bgAudioMannager.seek(parseInt(time))
}
回到顶部