报错原因:
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问答