由于
wx.arrayBufferToBase64
方法停止维护了,我试了很多其他的方法都不能有效的把文件流转成base64再交给innerAudioContext.src
播放声音。
最后的解决办法
- 从后端接收文件流。
- 将文件通过
writeFile
方法下载至本地。 - 使用下载的路径直接播放。
不知道为什么
writeFile
方法有时候无法覆盖同位置同名的文件,
播放时会播放之前储存的文件。
索性给文件名加上了不会重复的uuid,获取uuid的方法我是自己写的,放在下面了。
const {
uuid
} = require('../../utils/util');
wx.request({
url: `${baseURL}/speech/synthesize`, //调用后端接口
method: "POST",
header: {
//想在fromdata里添加参数需要加这个请求头(重要)
'content-type': 'application/x-www-form-urlencoded',
//给后端的token认证,没有可省略👇
'Authorization': `Bearer ${wx.getStorageSync('token')}`
},
//获取文件流
responseType: 'arraybuffer',
data: {
content: content
},
success(res) {
const path = `${wx.env.USER_DATA_PATH}/${that.data.id}-${uuid()}.mp3`;
const fsm = wx.getFileSystemManager();
fsm.writeFile({
filePath: path,
data: res.data,
encoding: 'base64',
success: (res) => {
const innerAudioContext = wx.createInnerAudioContext();
innerAudioContext.src = path;
innerAudioContext.play(); // 开始播放音频
},
});
},
fail(res) {
console.log(res);
}
})
// 获取uuid的方法,放在util里
const uuid = function () {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4";
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid
}
module.exports = {
uuid
}