uni-app 调用 InnerAudioContext.seek 方法后 innerAudioContext.onTimeUpdate 事件不再被回调

uni-app 调用 InnerAudioContext.seek 方法后 innerAudioContext.onTimeUpdate 事件不再被回调

开发环境 版本号 项目创建方式
Windows Windows10 1709 HBuilderX
产品分类:uniapp/小程序/微信

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.2.2

第三方开发者工具版本号:微信开发者工具1.05.2107090

基础库版本号:不知道

项目创建方式:HBuilderX

## 示例代码:

```javascript
createAudio() {  
    var innerAudioContext = this._audioContext = uni.createInnerAudioContext();  
    innerAudioContext.autoplay = this.isAutoplay;  
    innerAudioContext.src = this.musicList[this.playingPosition].fileId;  
}  

playTargetPosition(position) {  
    this._audioContext.stop();  
    this._audioContext.src = this.musicList[position].fileId;  
    this._audioContext.play();  
},  

onUserChange(data) {  
    this._audioContext.seek(data.detail.value / 1000);  
},  

操作步骤:

前提:音频文件为.m4a格式

  1. 初始化 InnerAudioContext 对象
  2. 修改 InnerAudioContext.src 变更播放地址
  3. 使用 InnerAudioContext.seek 方法变更播放进度

预期结果:

innerAudioContext.onTimeUpdate 事件能正常回调

实际结果:

innerAudioContext.onTimeUpdate 事件不再被回调

bug描述:

使用 InnerAudioContext 进行音频播放,在真机的微信小程序中,播放 .m4a 文件时。 首次播放一切正常,如果重新设置 InnerAudioContext.src 并调用play()方法做切换音频操作时, 音频切换后使用 InnerAudioContext.seek 方法拖动进度条后,innerAudioContext.onTimeUpdate 方法不再被回调。 实际的播放进度改变,只是 onTimeUpdate 方法不再被回调。 此问题只发生在Android 微信小程序真机运行效果中,使用模拟器或者在真机上以Debug模式运行都不会出现这个问题。


更多关于uni-app 调用 InnerAudioContext.seek 方法后 innerAudioContext.onTimeUpdate 事件不再被回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

根据你的描述大概率是微信小程序的bug,用微信原生小程序写法试试 m4a文件是网络地址还是本地路径? Android App平台也存在同样的问题,预计在 hx 3.2.10+ 修复

更多关于uni-app 调用 InnerAudioContext.seek 方法后 innerAudioContext.onTimeUpdate 事件不再被回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html


m4a文件是本地音频。 用微信小程序原生写法也就只是把uni.createInnerAudioContext() 换成 wx.createInnerAudioContext() 是么 这样的话我试了还是一样的效果

m4a文件是本地音频。 用微信小程序原生写法也就只是把uni.createInnerAudioContext() 换成 wx.createInnerAudioContext() 是么 这样的话我试了还是一样的效果

这个问题是微信小程序真机环境下的已知问题,主要与音频格式和播放状态管理有关。根据你的描述,问题出现在Android真机环境,且仅影响.m4a格式文件,核心原因可能是seek操作后音频播放状态异常导致onTimeUpdate事件回调中断。

解决方案:

  1. 延迟执行seek操作
    在切换音频并播放后,等待音频进入稳定播放状态再执行seek。可以添加短暂延时:

    onUserChange(data) {
        setTimeout(() => {
            this._audioContext.seek(data.detail.value / 1000);
        }, 300);
    }
    
  2. 重新绑定事件监听
    在每次seek操作后重新绑定onTimeUpdate事件,确保事件系统被激活:

    onUserChange(data) {
        this._audioContext.seek(data.detail.value / 1000);
        this._audioContext.onTimeUpdate = null; // 先解除绑定
        this._audioContext.onTimeUpdate(() => {
            // 你的时间更新逻辑
        });
    }
    
  3. 使用备用播放方案
    对于.m4a格式,考虑转换为MP3格式以规避此问题。如果必须使用.m4a,可在seek后尝试暂停再播放:

    onUserChange(data) {
        this._audioContext.seek(data.detail.value / 1000);
        this._audioContext.pause();
        setTimeout(() => {
            this._audioContext.play();
        }, 50);
    }
回到顶部