uni-app 【报Bug】同样的路径 audio 组件可以播放,uni.createInnerAudioContext() 显示 {"errMsg":"MediaError","errCode":-99}

发布于 1周前 作者 nodeper 来自 Uni-App

uni-app 【报Bug】同样的路径 audio 组件可以播放,uni.createInnerAudioContext() 显示 {“errMsg”:“MediaError”,“errCode”:-99}

示例代码:

//ws返回
(res) => {  
    console.log(res, '收到消息了====')  
    //使用createInnerAudioContext时候 使用下面代码  
    this.src = uni.arrayBufferToBase64(res)  
    //使用audio组件时候 使用下面代码  
    // this.src = `data:audio/mp3;base64,${uni.arrayBufferToBase64(res)}`;  
},


playAudio() {  
    if (this.src) {  
        this.audio= uni.createInnerAudioContext();  
        let base64Audio = `data:audio/mp3;base64,${this.src}`;  
        this.audio.src = base64Audio;  
        this.audio.autoplay = true  
        this.audio.onPlay(()=>{  
            console.log('播放了====')  
        });  
        this.audio.onError((err) => {  
            console.log(err, '播放失败了==')  
        })  
        this.audio.onEnded(function() {  
            this.audio.destroy();  
            console.log('开始播放了==')  
        });  
    } else {  
        console.error('No audio URL available');  
    }  
},

操作步骤:

//ws返回
(res) => {  
    console.log(res, '收到消息了====')  
    //使用createInnerAudioContext时候 使用下面代码  
    this.src = uni.arrayBufferToBase64(res)  
    //使用audio组件时候 使用下面代码  
    // this.src = `data:audio/mp3;base64,${uni.arrayBufferToBase64(res)}`;  
},


playAudio() {  
    if (this.src) {  
        this.audio= uni.createInnerAudioContext();  
        let base64Audio = `data:audio/mp3;base64,${this.src}`;  
        this.audio.src = base64Audio;  
        this.audio.autoplay = true  
        this.audio.onPlay(()=>{  
            console.log('播放了====')  
        });  
        this.audio.onError((err) => {  
            console.log(err, '播放失败了==')  
        })  
        this.audio.onEnded(function() {  
            this.audio.destroy();  
            console.log('开始播放了==')  
        });  
    } else {  
        console.error('No audio URL available');  
    }  
},

预期结果:

//ws返回
(res) => {  
    console.log(res, '收到消息了====')  
    //使用createInnerAudioContext时候 使用下面代码  
    this.src = uni.arrayBufferToBase64(res)  
    //使用audio组件时候 使用下面代码  
    // this.src = `data:audio/mp3;base64,${uni.arrayBufferToBase64(res)}`;  
},


playAudio() {  
    if (this.src) {  
        this.audio= uni.createInnerAudioContext();  
        let base64Audio = `data:audio/mp3;base64,${this.src}`;  
        this.audio.src = base64Audio;  
        this.audio.autoplay = true  
        this.audio.onPlay(()=>{  
            console.log('播放了====')  
        });  
        this.audio.onError((err) => {  
            console.log(err, '播放失败了==')  
        })  
        this.audio.onEnded(function() {  
            this.audio.destroy();  
            console.log('开始播放了==')  
        });  
    } else {  
        console.error('No audio URL available');  
    }  
},

预期 可以播放

实际结果:

播放不了 报错 {“errMsg”:“MediaError”,“errCode”:-99}

bug描述:

ws返回的 buffer数据 我转换成base64 然后data:audio/mp3;base64,${this.src}

同样的路径 audio 组件可以播放 ;uni.createInnerAudioContext() 显示 {“errMsg”:“MediaError”,“errCode”:-99}


6 回复

如果你这个音频文件又短,体积又大,可能是采样率过高了,使用ffmpeg调整转换率到44100即可 ffmpeg.exe -i onChecking.mp3 -ar 44100 onChecking44100.mp3 ffmpeg.exe -i onLongWaiting.mp3 -ar 44100 onLongWaiting44100.mp3 ffmpeg.exe -i onCheckFinish.mp3 -ar 44100 onCheckFinish44100.mp3 ffmpeg.exe -i onConnect.mp3 -ar 44100 onConnect44100.mp3 ffmpeg.exe -i newMsg.mp3 -ar 44100 newMsg44100.mp3


如果你有问题可以参考这个回答。 如果仍有问题,请提供脱敏后的音频文件用于测试。

audio 路径 是src srcs 是我把路径写死测试了一下

作者这个问题解决了吗

如果你有问题可以参考这个回答。
如果仍有问题,请提供脱敏后的音频文件用于测试。

在使用 uni-app 开发时,如果你遇到 uni.createInnerAudioContext() 报错 {"errMsg":"MediaError","errCode":-99},而同样的路径在 audio 组件中可以正常播放,可能是以下几个原因导致的:

1. 路径问题

  • 相对路径uni.createInnerAudioContext() 对路径的处理可能与 audio 组件不同。确保你使用的是绝对路径或正确的相对路径。
  • 网络路径:如果你使用的是网络路径,确保路径是有效的,并且服务器支持跨域请求。

解决方案

  • 尝试使用绝对路径或完整的网络路径。
  • 如果是本地文件,确保路径正确,并且文件存在于指定位置。

2. 文件格式问题

  • uni.createInnerAudioContext() 可能对某些音频格式支持不完全,或者文件本身存在问题。

解决方案

  • 确保音频文件格式是支持的格式(如 .mp3, .wav 等)。
  • 尝试使用其他音频文件进行测试。

3. 跨域问题

  • 如果你使用的是网络路径,可能会遇到跨域问题。audio 组件可能对跨域请求的处理与 uni.createInnerAudioContext() 不同。

解决方案

  • 确保服务器配置了正确的 CORS 头,允许跨域请求。
  • 如果是本地开发,可以尝试使用本地服务器来避免跨域问题。

4. 平台差异

  • uni-app 支持多平台,不同平台对 uni.createInnerAudioContext() 的实现可能有所不同。

解决方案

  • 检查你当前运行的平台(如微信小程序、H5、App 等),查看是否有平台特定的限制或问题。
  • 查阅 uni-app 官方文档,了解不同平台的兼容性。

5. 代码问题

  • 检查你的代码,确保 uni.createInnerAudioContext() 的使用方式正确。

示例代码

const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.src = 'https://example.com/path/to/audio.mp3';
innerAudioContext.play();

解决方案

  • 确保 src 属性设置正确,并且在调用 play() 之前已经设置好。

6. 错误处理

  • 添加错误处理逻辑,捕获并处理可能的错误。

示例代码

const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.src = 'https://example.com/path/to/audio.mp3';
innerAudioContext.onError((err) => {
    console.error('音频播放错误:', err);
});
innerAudioContext.play();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!