收藏
回答

使用了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()
    })


折腾了这么晚,应该算是解决了,但还是请大神指点,怎么做才是正确的解决方法!


回答关注问题邀请回答
收藏

1 个回答

  • 无限维度
    无限维度
    2020-11-30

    在onSeeking事件和onSeeked事件内访问一下音频实例的duration属性,onTimeUpdate就能正常回调。

    或者seek之前先pause,seek后再play,也能正常回调

    2020-11-30
    有用
    回复
登录 后发表内容
问题标签