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问答

相关推荐
杰克尼2 分钟前
JavaWeb_p165部门管理
java·开发语言·前端
EndingCoder4 分钟前
WebSocket实时通信:Socket.io
服务器·javascript·网络·websocket·网络协议·node.js
90后的晨仔4 分钟前
Vue3 状态管理完全指南:从响应式 API 到 Pinia
前端·vue.js
90后的晨仔19 分钟前
Vue 内置组件全解析:提升开发效率的五大神器
前端·vue.js
我胡为喜呀23 分钟前
Vue3 中的 watch 和 watchEffect:如何优雅地监听数据变化
前端·javascript·vue.js
一成码农24 分钟前
JavaSE面向对象(下)
java·开发语言
偶尔的鼠标人41 分钟前
Avalonia DataGrid 控件的LostFocus事件会多次触发
开发语言·c#
晚风残43 分钟前
【C++ Primer】第十二章:动态内存管理
开发语言·c++·c++ primer
我登哥MVP1 小时前
Ajax 详解
java·前端·ajax·javaweb
_extraordinary_1 小时前
Java Spring日志
java·开发语言·spring