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格式
- 初始化 InnerAudioContext 对象
- 修改 InnerAudioContext.src 变更播放地址
- 使用 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
根据你的描述大概率是微信小程序的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事件回调中断。
解决方案:
-
延迟执行seek操作
在切换音频并播放后,等待音频进入稳定播放状态再执行seek。可以添加短暂延时:onUserChange(data) { setTimeout(() => { this._audioContext.seek(data.detail.value / 1000); }, 300); } -
重新绑定事件监听
在每次seek操作后重新绑定onTimeUpdate事件,确保事件系统被激活:onUserChange(data) { this._audioContext.seek(data.detail.value / 1000); this._audioContext.onTimeUpdate = null; // 先解除绑定 this._audioContext.onTimeUpdate(() => { // 你的时间更新逻辑 }); } -
使用备用播放方案
对于.m4a格式,考虑转换为MP3格式以规避此问题。如果必须使用.m4a,可在seek后尝试暂停再播放:onUserChange(data) { this._audioContext.seek(data.detail.value / 1000); this._audioContext.pause(); setTimeout(() => { this._audioContext.play(); }, 50); }

