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
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, |
|
}) |
|
}, |
|
}, |
|
})
|
|
|