收藏
回答

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
回答关注问题邀请回答
收藏

15 个回答

  • end;
    end;
    2022-10-21

    今天是2022年10月21日,三年了,这个问题还没解决,于是我找到了这个帖子,很棒

    2022-10-21
    有用
    回复
  • styleの流光
    styleの流光
    2020-12-25


    解决方案https://blog.csdn.net/Vaskka/article/details/105326977

    2020-12-25
    有用
    回复
  • 小海螺
    小海螺
    2020-02-26
    1. 遇到同样的问题,照上面的方法处理后还是不行。
    2. 曲线救国,onPlay中,延时0.3s(onTimeUpdate好像是0.25s回调一次) ,判断onTimeUpdate是否执行,不执行就setInterval 循环处理,但是效果不太完美。
    3. 最终 每次播放完后,如果再次播放就重新加载一次音频文件,解决问题。
    2020-02-26
    有用
    回复
  • 书文
    书文
    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
    有用
    回复 1
    • 飞
      2019-12-20
      没有的啊,也会有这个情况
      2019-12-20
      回复

正在加载...

登录 后发表内容