收藏
回答

InnerAudioContext.onTimeUpdate再次调用不触发

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug innerAudioContext.onTimeUpdate 客户端 7.0.4 2.7.3

- 当前 Bug 的表现(可附上截图)

InnerAudioContext播放完以后再次播放,onTimeUpdate生命周期不会再次触发,但是onPlay,onEnd都能正常触发


- 预期表现

每次audio组件重新播放都能触发onTimeUpdate

- 复现路径


- 提供一个最简复现 Demo


InnerAudioContext.onTimeUpdate再次调用不触发

最后一次编辑于  2019-07-04
回答关注问题邀请回答
收藏

8 个回答

  • 燚
    2019-07-03

    onTimeUpdate是播放进度更新,重新播放为什么不再触发?

    2019-07-03
    赞同 1
    回复 15
    • 麦叻
      麦叻
      2019-07-04

      对 就是这个问题

      2019-07-04
      回复
    • 燚
      2019-07-04回复麦叻

      这边没重现不触发的case,你的设备信息是?

      2019-07-04
      回复
    • 麦叻
      麦叻
      2019-07-04回复

      这段代码片段 你导入看看Console 第二次播放不是也没触发吗

      2019-07-04
      回复
    • DuDuDu
      DuDuDu
      2019-07-04

      我这边也有这样的问题,不触发,求官方关注!

      2019-07-04
      2
      回复
    • 张胖子
      张胖子
      2019-07-18
      音频低于5秒,第一次点击播放可触发,第二次就不会触发。且ios上正常
      2019-07-18
      3
      回复
    查看更多(10)
  • Pumpkin Head
    Pumpkin Head
    01-10

    最近也碰到这个问题。发现如果不去读取innerAudioContext.paused这个变量,它不会主动更新。解决问题的思路就是在调用play()方法之后再主动读取一次paused变量。可以写一个settimeout函数。

    this.data.innerAudioContext.seek(0)
    this.data.innerAudioContext.play()
    setTimeout(() => {
      console.log(this.data.innerAudioContext.paused)
    }, 100)
    
    01-10
    赞同 2
    回复 1
    • Qiu
      Qiu
      02-27
      这个方法试过是可以的,我设的间隔是500
      02-27
      1
      回复
  • 左强
    左强
    2019-08-15

    在onEnded里面写 innerAudioContext.seek(0)即可解决


    2019-08-15
    赞同 2
    回复 8
    查看更多(3)
  • 小海螺
    小海螺
    02-26
    1. 遇到同样的问题,照上面的方法处理后还是不行。
    2. 曲线救国,onPlay中,延时0.3s(onTimeUpdate好像是0.25s回调一次) ,判断onTimeUpdate是否执行,不执行就setInterval 循环处理,但是效果不太完美。
    3. 最终 每次播放完后,如果再次播放就重新加载一次音频文件,解决问题。
    02-26
    赞同
    回复
  • 温磊
    温磊
    02-16

    经过反复测试,onTimeUpdate不触发确实是和onWaiting有关

    但不是注释掉onWaiting就正常了(上边大兄弟提供的方案),是音频只要不触发onWaiting,onTimeUpdate就是正常的

    而当拖动进度或者播放完毕后重新播放,都会触发onWaiting,然后onTimeUpdate就挂了

    02-16
    赞同
    回复 2
  • 书文
    书文
    2019-12-25

    华为nova 2s 测试可跟随循环播放进行循环触发,但在开发工具上在开始第二次播放后便停止触发------同求解决办法,尚未在iphone真机测试,不知目前是否仅是开发工具上如此


    目前解决的大致思路是 

    猜测:开发工具中仅在新建InnerAudio实例时触发“一轮”onTimeUpdate直至一轮播放结束


    大体解决思路: "互相传球"——新建两个InnerAudio实例,互相在对方onEnded时新建对方实例,同时在对方实例中销毁自己(注意innerAudio.loop不能设置为true,实践证明这样无法触发onEnded!------此时一想,莫非开发工具中onTimeUpdate的触发和onEnded的触发存在某种未知联系?)


    具体一点点:

    通过在Page({})下分别新建两个InnerAudio实例,实例中分别在onEnded时新建另一各实例,而同时另一个实例中销毁前一个audio实例.....从而实现“互相传球”


    主要代码如下(具体功能可无视):

      toAC_0: function () {

        console.log('target_0')

        let _this = this

        if (_this.audioContext_1.play) {//如果第二个audio实例存在,则销毁

          _this.audioContext_1.destroy()

          _this.audioContext_1 = null

        }

        _this.audioContext_0 = new Object()//因为在_this.toAC_1中_this.audioContext_0已经被赋值null(原因略)

        _this.audioContext_0 = wx.createInnerAudioContext()

        _this.audioContext_0.src = 'cloud://superteam-hzq0j.7375-superteam-hzq0j-1300417025/app/login/bgm.mp3'

        _this.audioContext_0.autoplay = true

        //_this.audioContext_0.loop = true

        _this.audioContext_0.onEnded(() => {

          console.log('onEnded_0!')

          _this.toAC_1()

        })

        _this.audioContext_0.onTimeUpdate(() => {

          console.log('已触发onTimeUpdate_0!')

          console.log('onTimeUpdate-duration_0: ', _this.audioContext_0.duration)

          let deg_0 = (360 * _this.audioContext_0.currentTime / _this.audioContext_0.duration + 45)

          let deg = deg_0 <= 180 ? deg_0 : (deg_0 - 360)

          let bgc = [deg, 128, 128, 128, 8, 245, 8]

          console.log(bgc[0])

          _this.setData({

            bgc: bgc

          })

        })

        _this.audioContext_0.onError(err => {

          console.log('audioOnErr: (上次是音源有问题导致无法循环!可供参考)', err)

        })

      },

      toAC_1: function () {

        console.log('target_1')

        let _this = this

        if (_this.audioContext_0.play) {//如果第一个audio实例存在,则销毁

          _this.audioContext_0.destroy()

          _this.audioContext_0 = null

        }

        _this.audioContext_1 = new Object()//因为在_this.toAC_0中_this.audioContext_1已经被赋值null(原因略)

        _this.audioContext_1 = wx.createInnerAudioContext()

        _this.audioContext_1.src = 'cloud://superteam-hzq0j.7375-superteam-hzq0j-1300417025/app/login/bgm.mp3'

        _this.audioContext_1.autoplay = true

        //_this.audioContext_1.loop = true

        _this.audioContext_1.onEnded(() => {

          console.log('onEnded_1!')

          _this.toAC_0()

        })

        _this.audioContext_1.onTimeUpdate(() => {

          console.log('已触发onTimeUpdate_1!')

          console.log('onTimeUpdate-duration_1: ', _this.audioContext_1.duration)

          let deg_0 = (360 * _this.audioContext_1.currentTime / _this.audioContext_1.duration + 45)

          let deg = deg_0 <= 180 ? deg_0 : (deg_0 - 360)

          let bgc = [deg, 128, 128, 128, 8, 245, 8]

          console.log(bgc[0])

          _this.setData({

            bgc: bgc

          })

        })

        _this.audioContext_1.onError(err => {

          console.log('audioOnErr: (上次是音源有问题导致无法循环!可供参考)', err)

        })

      },

      addBgMusic: function () {

        let _this = this

        _this.bgmSrc = 'cloud://superteam-hzq0j.7375-superteam-hzq0j-1300417025/app/login/bgm.mp3'

        _this.audioContext_0 = new Object()

        _this.audioContext_1 = new Object()

        /**

         * 此处通过

         * let bgMusicaudioContext_0 = _this.audioContext_0

         * 无法形成指向getApp().globalData.bgMusic.audioContext_0d的指针效果?

         */

        if (_this.audioContext_0.play || _this.audioContext_1.play){//如果已经创建bgMusic,则直接播放(避免重复创建)

          if (_this.audioContext_0.play){

            _this.audioContext_0.play()

          }

          else{

            _this.audioContext_1.play

          }

        }

        else{

          _this.toAC_0(_this)

        }

      },

      removeBgMusic: function(){

        /*

        //对于微信小程序社区所讨论innerAudioaudioContext_0.destroy()的不确定性

        //此处采用先stop,再destroy

        //确保不会意外的无法停止播放

        */

        let _this = this

        if (_this.audioContext_0 || _this.audioContext_1) {//多这一层if为了看起来“局部整体化”

          /**

          * 经测试,destroy并未真正销毁innerAudioaudioContext_0

          */

          if (_this.audioContext_0) {//加这一层为了避免直接访问_this.audioContext_0.play出错

            if (_this.audioContext_0.play){

              _this.audioContext_0.destroy()

              _this.audioContext_0 = null

            }

          }

          if (_this.audioContext_1) {//加这一层为了避免直接访问_this.audioContext_1.play出错

            if (_this.audioContext_1.play){

              _this.audioContext_0.destroy()

              _this.audioContext_0 = null

            }

          }

        }

      },


    现已经在开发工具中和真机 华为 nova 2s真机中测试可无限循环触发onTimeUpdate(参看console.log内容可知)


    小白的学习之路,如有可改进之处,请指教!谢谢!



    2019-12-25
    赞同
    回复 2
  • Castiel
    Castiel
    2019-11-26

    遇到同样情况,貌似同时存在 innerAudioContext.onWaiting 的情况下就会有这个问题,注释之后就正常了。


    2019-11-26
    赞同
    回复 2
    • 飞
      2019-12-20
      没有的啊,也会有这个情况
      2019-12-20
      回复
    • 温磊
      温磊
      02-16
      注释掉并不能解决问题,音频只要触发onWaiting,onTimeUpdate就不正常
      02-16
      回复
  • 一个脱离了高级趣味的人
    一个脱离了高级趣味的人
    2019-11-26

    我也遇到同样的问题 真心觉得小程序做的贼垃圾

    2019-11-26
    赞同
    回复 1
    • 小精灵
      小精灵
      2019-12-11
      我也 遇到了同样的问题,请问最后是怎么解决的?
      2019-12-11
      回复
登录 后发表内容