在onSeeking事件和onSeeked事件内访问一下音频实例的duration属性,onTimeUpdate就能正常回调。 或者seek之前先pause,seek后再play,也能正常回调
使用了seek()前进后退,onTimeUpdate()前台就不刷新了,虽然解决,但不明白原因?菜鸟一个,遇上问题只能以最笨的方法解决,请大神赐教,有没有更好的方法! data: { curM: 0, // 当前播放时间 AudioUrl: "cloud://xxx.mp3" }, // 监听音频播放进度更新事件 innerAudioContext.onTimeUpdate((e) => { this.setData({ curM: parseInt(innerAudioContext.currentTime) }) }) 原本想着就这么简单的东西,在 {{curM}}s调用就可以了,没想到,当使用了快进和后退之后就不再刷新了: // 快进 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() }) 折腾了这么晚,应该算是解决了,但还是请大神指点,怎么做才是正确的解决方法!
2020-11-30