报错原因:
uniapp的uni.createInnerAudioContext不支持直接播放base64音频文件,所以需要把base64音频转为本地音频文件再播放,缺点是转换会导致延迟,音频播放会有延迟
utils文件夹下新建tool.js文件
tool.js文件代码:
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下面导入
<script>
import { base64ToFile } from "@/utils/tools.js";
方法中使用:
const base64Audio = uni.arrayBufferToBase64(response.data);const base64WithPrefix = `data:audio/mp3;base64,${base64Audio}`;// 使用 Promise 包装回调式的 base64ToFileconst 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问答