uni-app 播放oss网络音频错误 MediaError -99
uni-app 播放oss网络音频错误 MediaError -99
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 20H2 | HBuilderX |
操作步骤:
使用阿里云oss加密地址创建innerAudioContext
预期结果:
正常播放音频
实际结果:
无法播放音频
bug描述:
uni.createInnerAudioContext()
在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)播放音频时,可能因以下原因导致该错误:
- URL 格式或签名问题:OSS 加密地址可能包含特殊字符(如
+、=、&),在拼接或传输时被错误解析,导致最终请求的 URL 无效。 - 跨域问题(CORS):OSS 存储桶未正确配置跨域规则,浏览器或 App 端请求被阻止。
- 网络协议限制:部分安卓设备对非 HTTPS 链接的音频资源支持不佳,而 OSS 地址可能为 HTTP。
- 音频格式兼容性:某些音频编码格式(如 MP3 的特定编码参数)在部分平台不被支持。
解决方案:
-
检查 OSS 地址有效性:
- 确保加密地址完整且未过期(签名 URL 通常有有效期)。
- 将地址粘贴到浏览器中直接测试是否能下载或播放。
-
处理 URL 特殊字符:
- 若地址包含特殊字符,使用
encodeURI()对完整 URL 进行编码,或对参数部分单独编码:const audioUrl = encodeURI('你的OSS加密地址'); innerAudioContext.src = audioUrl;
- 若地址包含特殊字符,使用
-
配置 OSS 跨域规则:
- 登录阿里云 OSS 控制台,为存储桶添加跨域规则(CORS),允许来源域(如
*或你的域名)和GET方法。
- 登录阿里云 OSS 控制台,为存储桶添加跨域规则(CORS),允许来源域(如
-
强制使用 HTTPS:
- 将 OSS 地址显式改为
https://开头(若支持),避免混合协议问题。
- 将 OSS 地址显式改为
-
测试音频格式:
- 尝试更换为标准 MP3 或 AAC 格式的音频文件,避免非常用编码参数。
-
使用网络请求调试:
- 在 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();
}
});

