菜鸟一个,遇上问题只能以最笨的方法解决,请大神赐教,有没有更好的方法!
data: {
curM: 0, // 当前播放时间
AudioUrl: "cloud://xxx.mp3"
},
// 监听音频播放进度更新事件
innerAudioContext.onTimeUpdate((e) => {
this.setData({
curM: parseInt(innerAudioContext.currentTime)
})
})
原本想着就这么简单的东西,在
// 快进
handleForward: function (e) {
var data = ({
curM: this.data.curM + 10,
})
innerAudioContext.seek(data.curM)
this.setData(data);
},
// 快退
handleBackward: function (e) {
this.setData({
curM: this.data.curM - 10,
})
if (this.data.curM < 0) {
innerAudioContext.seek(0);
} else {
innerAudioContext.seek(this.data.curM);
}
}
就是这么痛苦,别扭的不要不要!当快进或者后退的时候,这个世界就暂停了,大脑一篇空白。
后来百度一番,解决方法是:
innerAudioContext.onWaiting(() => {
innerAudioContext.pause()
})
// 监听音频进入可以播放状态的事件。但不保证后面可以流畅播放
innerAudioContext.onCanplay(() => {
innerAudioContext.play()
})
喜出望外,开发者工具调试,一切OK!
但是...
对于菜鸟来说总有个但是,预览的时候,ios干脆罢工,不播放,更不用说实时获取播放时间了,什么错误都不输出!
于是四处乱改,终于被我发现了,就是红色的,红色的代码:
innerAudioContext.onWaiting(() => {
innerAudioContext.pause() //我去,居然染不出红色,就这句!
})
如果你注释掉这句,ios一切ok!Android,当你快进或后退之后,时间就不刷新了!反之使用这句,Android正常,ios一声不吭。
实在不懂就只能硬来了,加个判断,是Android就用,是ios就不用,最后完整的代码就这样:
/**
* 关于onTimeUpdate失效,无法实时获取当前播放的时间问题:
* 1. 监听快进或快退后进入缓冲加载状态,调用一次pause()
* 2. 在进入可播放状态后,调用play()就可以再次激活onTimeUpdate
* 监听音频加载中事件。当音频因为数据不足,需要停下来加载时会触发
*/
innerAudioContext.onWaiting(() => {
// 为了解决onTimeUpdate()前台不刷新的问题,需要调用一次pause()
// 但是如果调用,ios就不能正常播放,因此判断平台,决定是否调用pause()
wx.getSystemInfo({
success(res) {
if (res.platform == "ios") {
// IOS 平台
} else if (res.platform == "android") {
// Android平台
innerAudioContext.pause()
} else if (res.platform == "devtools") {
// 开发工具
innerAudioContext.pause()
}
},
fail(res) {},
complete() {},
})
})
// 监听音频进入可以播放状态的事件。但不保证后面可以流畅播放
innerAudioContext.onCanplay(() => {
innerAudioContext.play()
})
折腾了这么晚,应该算是解决了,但还是请大神指点,怎么做才是正确的解决方法!
在onSeeking事件和onSeeked事件内访问一下音频实例的duration属性,onTimeUpdate就能正常回调。
或者seek之前先pause,seek后再play,也能正常回调