2***@qq.com
2***@qq.com
  • 发布:2026-04-15 20:32
  • 更新:2026-04-15 20:32
  • 阅读:27

【报Bug】uni.createInnerAudioContext() 这个一直再报{ "errMsg": "MediaError", "errCode": -99 }

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 25H2

HBuilderX类型: 正式

HBuilderX版本号: 5.07

手机系统: Android

手机系统版本号: Android 14

手机厂商: OPPO

手机机型: a58

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

uni.showLoading({
title: '音频加载中...',
mask: true
});
console.log('初始化音频:1111', this.audioContext);
if (this.audioContext) {
try {
this.audioContext.pause();
this.audioContext.destroy()
this.audioContext = null
} catch (e) {
console.log('销毁音频上下文失败:', e);
//TODO handle the exception
}
}
// 创建音频上下文
this.audioContext = uni.createInnerAudioContext();
if (path) {
this.audioContext.src = path;
} else {
this.audioContext.src = 'https://gw.alipayobjects.com/os/bmw-prod/0574ee2e-f494-45a5-820f-63aee583045a.wav';//音频文件
}
this.audioContext.playbackRate = this.currentSpeed;
// 监听音频加载完成
this.audioContext.onCanplay((e) => {
uni.hideLoading();
console.log('音频加载完成:', e);
// 监听播放进度
this.audioContext.onTimeUpdate(() => {
if (this.audioContext && this.audioContext.duration) {
this.playProgress = this.audioContext.currentTime / this.audioContext.duration;
}
});

        });  
        // 监听音频加载错误  
        this.audioContext.onError((err) => {  
            console.error('音频加载错误:', err);  
            uni.hideLoading();  
        });  
        // 监听播放结束  
        this.audioContext.onEnded(() => {  
            this.isPlaying = false;  
            // 播放结束不重置进度,点击重新播放时会自动从头开始  
        });

预期结果:

应该会有currentTime 和duration

实际结果:

{
"errMsg": "MediaError",
"errCode": -99
}

bug描述:

uni.createInnerAudioContext()一直报{
"errMsg": "MediaError",
"errCode": -99
}

2026-04-15 20:32 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

这个bug反馈整体内容较为完整,但存在一些关键信息缺失和概念混淆,以下是详细评审:

反馈质量评价

从信息完整性来看,该反馈包含了基本的运行环境(HBuilderX 5.07、Android 14、OPPO a58、Vue2)、错误现象(errCode: -99)和复现代码。代码示例提供了完整的业务逻辑,官方人员可以直接理解其意图:在切换音频时先销毁旧实例再创建新实例。

但复现步骤描述不够清晰,目前的"复现步骤"实际上是代码逻辑展示,缺少操作层面的描述(如:是首次播放就报错,还是连续切换多个音频后报错?每次必现还是偶现?)。预期结果和实际结果描述准确,分类信息完整。

问题分析

这个报错不是新bug,而是已知的开发注意事项。在知识库的 createInnerAudioContext 兼容性文档 中明确说明:

当出现-99错误时,通常是因为多次调用播放新的文件时实例未正确销毁。文档提供的解决方案是:

if (innerAudioContext) {  
  try {  
    innerAudioContext.pause();  
    innerAudioContext.destroy()  
    innerAudioContext = null  
  } catch (e) {  
    //TODO handle the exception  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

观察用户提供的代码,虽然包含了上述销毁逻辑,但可能存在时序问题destroy() 是异步操作,立即重新创建实例可能导致资源未完全释放。建议确保销毁完成后再创建新实例,或增加延时处理。

另外需要注意,用户使用的音频格式是 WAV,知识库中显示 WAV 格式在 Android 平台是支持的(√),但建议也测试 MP3 格式排除格式兼容性问题。

建议补充的信息

为精确定位问题,建议用户补充:

  1. 是每次播放都报错,还是连续切换多个音频后才出现?
  2. 音频文件的网络加载状态(是否使用了本地文件测试对比?)
  3. 是否在 destroy() 后增加延时再创建新实例测试过?

解决方案建议

基于知识库内容,建议采用以下方式避免-99错误:

  1. 确保 destroy() 后适当延时(如 100-200ms)再创建新实例
  2. 或者复用单一实例,仅更换 src 属性并重新 play(),避免频繁创建销毁
  3. 如需更完善的音频播放功能,可参考插件市场的 音频播放器插件,该插件已针对-99错误进行了优化处理

该反馈属于开发使用问题,非框架缺陷,建议标记为"使用咨询"而非"Bug"。

内容为 AI 生成,仅供参考

要回复问题请先登录注册