此处 用的是小程序创建 innerAudioContext , 因为创建innerAudioContext 的src 属性的值, 只能是本地路径 或 在线地址 , 所以后台返回的文件流数据没有作用 .
而且小程序是没有办法像js一样将文件流数据 , 利用blob URL.createobjecturl 来进行 对 innerAudioContext.src 来进行赋值 , 所以我们要将文件流下载下来 (wx.downloadFile) , 用本地路径来 对 src 赋值
以下是 代码 可以直接复制 ,
注意点:
1 . 前端 , 后端都要设置 header 中 ‘Content-type’: ‘audio/mp3’ !!! 后端不设置 , 前端可以 撂挑子 不干活了 ,
2. 安卓是将文件下载下来 , 用本地路径对 src 赋值 , 但是 ios 不行 , ios可以直接赋值 文件流
在这里插入代码片 , vant组件库
只看逻辑就好 , 这里代码很垃圾 , 项目很坑 , 我也不想重写了
downLoadUrl() {
let self = this
return new Promise(resolve => {
wx.downloadFile({
url: self.data.downloadMp3 + self.data.audioSrc,
header: {
'Content-type': 'audio/mp3'
},
success(res) {
wx.saveFile({
tempFilePath: res.tempFilePath,
success(res) {
const savedFilePath = res.savedFilePath
self.setData({
abc: fasle
})
resolve(
savedFilePath
)
}
})
}
})
})
},
async bofang(e) {
const { system } = wx.getSystemInfoSync()
var self = this
let audioSrc = e.currentTarget.dataset.voice;
let countDown = this.selectComponent('.control-count-down1' + audioSrc);
let countDown1 = this.selectComponent('.control-count-down1' + this.data.src);
self.setData({
countDown,
audioSrc
})
if (self.data.abc) {
if (system.toLocaleLowerCase().includes('ios')) {
self.setData({
downLoadAudio: self.data.downloadMp3 + self.data.audioSrc
})
} else {
let res = await self.downLoadUrl()
self.setData({
downLoadAudio: res
})
}
}
if (this.data.videoImgSrc != audioSrc) {
if (this.data.src && this.data.src != audioSrc) {
this.data.innerAudioContext.src = ''
countDown1.reset()
if (system.toLocaleLowerCase().includes('ios')) {
self.setData({
downLoadAudio: self.data.downloadMp3 + self.data.audioSrc
})
} else {
let res = await self.downLoadUrl()
self.setData({
downLoadAudio: res
})
}
}
this.data.innerAudioContext.src = self.data.downLoadAudio
if(this.data.innerAudioContext.src) {
this.data.innerAudioContext.play();
self.setData({
videoImgSrc: audioSrc,
src: audioSrc
})
console.log('倒计时实例', countDown)
countDown.start();
}
} else {
countDown.pause()
this.data.innerAudioContext.pause();
this.setData({
videoImgSrc: '',
})
return
}
},