You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

191 lines
4.5 KiB

const app = getApp()
import dayjs from 'dayjs'
Component({
behaviors: [],
properties: {
audio: {
type: Object,
observer(val) {
if (val && this._currentAudioUrl && val.url === this._currentAudioUrl) {
return
}
this._currentAudioUrl = val ? val.url : ''
if (this.audioContext) {
const { play } = this.data
if (play) {
this.audioContext.pause()
this.setData({
play: false,
progress: 0,
time: '00',
})
}
this.audioContext.destroy()
}
if (val) {
this.audioAddEventListener(val)
}
},
},
},
data: {
Timestamp: app.globalData.Timestamp,
progress: 0,
time: '00',
duration: '00',
play: false,
loading: true,
imageUrl: app.globalData.imageUrl,
progressimg: true,
},
lifetimes: {
created() {
app.getTheme().then((res) => {
this.setData({
theme: res,
})
})
},
async attached() {},
moved() {},
detached() {
if (this.audioContext) {
const { play } = this.data
if (play) {
this.audioContext.pause()
}
this.audioContext.destroy()
}
this.audioAddEventListener = null
this.setData({
play: false,
progress: 0,
time: '00',
})
},
},
pageLifetimes: {
show: function () {
if (this.data._pausedByHide && this.audioContext) {
this.data._pausedByHide = false
this.audioContext.play()
}
},
hide: function () {
const { play } = this.data
if (play) {
this.data._pausedByHide = true
this.audioContext.pause()
}
},
resize: function () {},
},
methods: {
togglePlay() {
const { play, loading } = this.data
if (loading) {
wx.showToast({
title: '音频加载中',
icon: 'none',
})
return
}
if (play) {
this.audioContext.pause()
} else {
this.audioContext.play()
}
},
formatTime(time) {
let m = parseInt(time / 60)
let s = parseInt(time % 60)
return this.towNum(m) + ':' + this.towNum(s)
},
towNum(num) {
if (num >= 10) {
return num
} else {
return '0' + num
}
},
audioAddEventListener(val) {
const that = this
this.setData({
duration: this.formatTime(val.size),
})
that.audioContext = wx.createInnerAudioContext()
that.audioContext.src = val.url
that.setData({
loading: false,
})
that.audioContext.onError(({ errCode, ...reset }) => {
console.log('reset: ', reset)
console.log('errCode: ', errCode)
if (errCode === 10004 || errCode == 10001 || errCode == -1) {
that.audioContext.destroy()
that.setData({
loading: true,
})
setTimeout(() => {
that.audioAddEventListener(val)
}, 300)
}
})
that.audioContext.onPlay(() => {
that.setData({
play: true,
})
})
that.audioContext.onPause(() => {
console.log(1111111)
that.setData({
play: false,
})
})
that.audioContext.onEnded(() => {
that.audioContext.seek(0)
that.setData({
play: false,
progress: 0,
time: '00',
})
})
that.audioContext.onTimeUpdate(() => {
const duration = that.audioContext.duration || 0
const currentTime = that.audioContext.currentTime || 0
const progress = (currentTime / duration) * 100
if (duration == Infinity) {
return
}
that.setData({
play: true,
duration: that.formatTime(duration),
time: that.formatTime(currentTime),
})
if (that.data.progressimg) {
this.setData({
progress: progress,
})
}
})
},
handleAuthChangeimg() {
console.log(11111)
this.setData({
progressimg: false,
})
},
handleAuthChange(e) {
console.log(22222222222)
let { duration } = this.data
const secods = this.audioContext.duration || duration.split(':')[0] * 60 + duration.split(':')[1] * 1
const progress = e.detail.value
let seek = ((secods / 100) * progress).toFixed(3) * 1
this.audioContext.seek(seek)
this.setData({
progressimg: true,
})
},
},
})