uni-app 播放oss网络音频错误 MediaError -99

uni-app 播放oss网络音频错误 MediaError -99

开发环境 版本号 项目创建方式
Windows 20H2 HBuilderX

操作步骤:

使用阿里云oss加密地址创建innerAudioContext

预期结果:

正常播放音频

实际结果:

无法播放音频

bug描述:

uni.createInnerAudioContext()
10 回复

在h5页面中可以,但在手机好像播放不了

更多关于uni-app 播放oss网络音频错误 MediaError -99的实战教程也可以访问 https://www.itying.com/category-93-b0.html


我这边也遇到这个问题了,https换成http就好了。找了一圈资料,貌似是一个2020年出现过的老问题,在最近的版本里又引入进来了?我尝试过,正式服务器https播放出问题,改http正常,测试服务器https又没问题。看起来像是uni这边对证书信任相关问题没处理好。蛋疼的是我给正式服务器重新颁发了SSL证书,还是有问题。已经另发帖提bug了。

我换成video组件来播放了,暂时用着,audio看官方怎么说吧

回复 2***@qq.com: 已解决:https://ask.dcloud.net.cn/question/138148

回复 2***@qq.com: 老哥 这个问题解决了吗 我现在用腾讯云的oss也遇到这个问题了 而且是只有一部分手机会遇到

我遇到跟你一样的问题了 地址是腾讯云加密后的地址 播放就会报-99错误

之前是用video组件来替换了播放,audio这个地址问题不知道修复没

回复 2***@qq.com: 没有修复 但是video的api太少了 好多功能实现不了

这两个文章应该是同一个问题 https://ask.dcloud.net.cn/question/146174

问题分析: MediaError -99 错误通常表示音频资源加载失败或网络请求被拒绝。使用阿里云 OSS 加密地址(如带签名的 URL)播放音频时,可能因以下原因导致该错误:

  1. URL 格式或签名问题:OSS 加密地址可能包含特殊字符(如 +=&),在拼接或传输时被错误解析,导致最终请求的 URL 无效。
  2. 跨域问题(CORS):OSS 存储桶未正确配置跨域规则,浏览器或 App 端请求被阻止。
  3. 网络协议限制:部分安卓设备对非 HTTPS 链接的音频资源支持不佳,而 OSS 地址可能为 HTTP。
  4. 音频格式兼容性:某些音频编码格式(如 MP3 的特定编码参数)在部分平台不被支持。

解决方案:

  1. 检查 OSS 地址有效性

    • 确保加密地址完整且未过期(签名 URL 通常有有效期)。
    • 将地址粘贴到浏览器中直接测试是否能下载或播放。
  2. 处理 URL 特殊字符

    • 若地址包含特殊字符,使用 encodeURI() 对完整 URL 进行编码,或对参数部分单独编码:
      const audioUrl = encodeURI('你的OSS加密地址');
      innerAudioContext.src = audioUrl;
      
  3. 配置 OSS 跨域规则

    • 登录阿里云 OSS 控制台,为存储桶添加跨域规则(CORS),允许来源域(如 * 或你的域名)和 GET 方法。
  4. 强制使用 HTTPS

    • 将 OSS 地址显式改为 https:// 开头(若支持),避免混合协议问题。
  5. 测试音频格式

    • 尝试更换为标准 MP3 或 AAC 格式的音频文件,避免非常用编码参数。
  6. 使用网络请求调试

    • 在 HBuilderX 中运行到浏览器,通过开发者工具的 Network 面板检查音频请求状态码和响应头。
    • 真机调试时,使用 innerAudioContext.onError 捕获详细错误信息:
      innerAudioContext.onError((res) => {
        console.log('音频错误详情:', res.errMsg, res.errCode);
      });
      

临时替代方案: 若上述步骤无效,可尝试将 OSS 音频文件下载到本地临时路径后再播放(注意大文件可能影响体验):

uni.downloadFile({
  url: '你的OSS加密地址',
  success: (res) => {
    innerAudioContext.src = res.tempFilePath;
    innerAudioContext.play();
  }
});
回到顶部