uni.createInnerAudioContext() 报错{“errMsg“:“MediaError“,“errCode“:-99}

报错原因:

uniapp的uni.createInnerAudioContext不支持直接播放base64音频文件,所以需要把base64音频转为本地音频文件再播放,缺点是转换会导致延迟,音频播放会有延迟

utils文件夹下新建tool.js文件

tool.js文件代码:

javascript 复制代码
export const base64ToFile = (base64Str, fileName, callback) => {
  var index = base64Str.indexOf(',');
  var base64Str = base64Str.slice(index + 1, base64Str.length);

  plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
    fs.root.getFile(fileName, {
      create: true
    }, function(entry) {
      var fullPath = entry.fullPath;
      let platform = uni.getSystemInfoSync().platform;
      if (platform == 'android') {
        var Base64 = plus.android.importClass("android.util.Base64");
        var FileOutputStream = plus.android.importClass("java.io.FileOutputStream");
        try {
          var out = new FileOutputStream(fullPath);
          var bytes = Base64.decode(base64Str, Base64.DEFAULT);
          out.write(bytes);
          out.close();
          callback && callback(entry.toLocalURL());
        } catch (e) {
          console.log(e.message);
        }
      } else if (platform == 'ios') {
        var NSData = plus.ios.importClass('NSData');
        var nsData = new NSData();
        nsData = nsData.initWithBase64EncodedStringoptions(base64Str, 0);
        if (nsData) {
          nsData.plusCallMethod({
            writeToFile: fullPath,
            atomically: true
          });
          plus.ios.deleteObject(nsData);
        }
        callback && callback(entry.toLocalURL());
      }
    });
  });
}; 

在script下面导入

javascript 复制代码
<script>
import { base64ToFile } from "@/utils/tools.js";

方法中使用:

javascript 复制代码
      const base64Audio = uni.arrayBufferToBase64(response.data);
        const base64WithPrefix = `data:audio/mp3;base64,${base64Audio}`;
        
        // 使用 Promise 包装回调式的 base64ToFile
        const filePath = await new Promise((resolve) => {
          const fileName = `${word}_${Date.now()}.mp3`;
          base64ToFile(base64WithPrefix, fileName, (path) => {
            resolve(path);
          });
        });

参考文献:
uniapp开发安卓和ios播放base64音频(mp3,wav都可以),或者处理其它类型的base64数据成为url_uniapp 播放base64-CSDN博客 uniapp能播放base64格式的音频吗? - DCloud问答

相关推荐
橙子家27 分钟前
浏览器缓存之【结构化数据库与缓存】: IndexedDB、Cache storage 和 Storage buckets
前端
user205855615181333 分钟前
X6 中边悬浮置顶,规避 `mouseleave` 事件丢失问题
前端
李明卫杭州34 分钟前
CSS aspect-ratio 属性完全指南
前端
Pedantic2 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘3 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆3 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师4 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆4 小时前
VSCode自动格式化三要素
前端
爱勇宝5 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员