收藏
回答

InnerAudioContext 安卓下获取不到duration,获取出来全是0

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug InnerAudioContext 微信安卓客户端 最新 最新

问题如题,此问题存在至少一年以上,论坛全是问这个,都是问要代码片段就没有然后了,别问我要代码片段了,论坛里到处都是,这bug就解决不了了吗?

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

10 个回答

  • 社区技术运营专员-CJiang
    社区技术运营专员-CJiang
    07-15

    麻烦试一下这个代码片段:https://developers.weixin.qq.com/s/8JFSnRmy76iU,看能不能复现,这边这个安卓手机可以获取到这个duration不为0


    07-15
    有用
    回复 10
    • 大壞蛋
      大壞蛋
      07-15
      试过了,相关的帖子我都挨个看了
      07-15
      回复
    • 大壞蛋
      大壞蛋
      07-15
      上是我代码和控制台输出,论坛里的相关帖子很多,去年就有人问了,都是要代码片段然后就没有然后了,次代码iOS下可以,安卓就是不行
      07-15
      回复
    • 社区技术运营专员-CJiang
      社区技术运营专员-CJiang
      07-16回复大壞蛋
      麻烦提供一下具体的机型,微信版本号,基础库的版本号。
      07-16
      回复
    • 社区技术运营专员-CJiang
      社区技术运营专员-CJiang
      07-16
      可以用存在问题的机型扫一下下面的二维码
      07-16
      回复
    • 大壞蛋
      大壞蛋
      07-16
      07-16
      回复
    查看更多(5)
  • 夏末丿
    夏末丿
    08-05

    这个可以,onCanplay在安卓上要进入播放状态才取得到值,ios就不用,不知道为啥,是官方的bug嘛??

    08-05
    有用 2
    回复
  • 红豆咖啡
    红豆咖啡
    08-04

    在安卓上面,我也遇到这个问题,我找到一个解决方法。

    因为调用 play()方法时,可以获取到时长,所以初始化时调用一次play()方法,最后再调用暂停方法,可以解决这个问题,在这获取之前,页面可以加一个loading过渡

    08-04
    有用 2
    回复
  • 3
    3
    10-23

    通过云函数获取

    -------------更新--------------

    以上方法不是很稳定,对远程url偶尔报错

    下面是新的方案

    10-23
    有用 1
    回复
  • 彦斌
    彦斌
    10-29
    const audioContext = wx.createInnerAudioContext();
    const loadDuration = function () {
         setTimeout(() => {
            if (audioContext.duration === 0) {
                loadDuration();
             } else {
                // 获取到正确的duration
             }
         }, 100);
    };
    audioContext.onCanplay(loadDuration);
    
    10-29
    有用
    回复
  • Harry🐼🐼
    Harry🐼🐼
    10-24

    我也遇到了,这就是微信的BUG。 试过很多种办法都不行

    10-24
    有用
    回复
  • Lofty
    Lofty
    10-22

    我的做法是,数据库增加一个音频时长的字段,在播放前直接赋值到给自定义的播放器

    10-22
    有用
    回复
  • 大锣鼓
    大锣鼓
    10-19

    音频播放时间在10s之前,获取不到duration值。

    const app = getApp()
    const audioBk = wx.createInnerAudioContext(); // 创建音频播放对象
    Page({
      data: {
        m:0,
        curM:0,
      },
      onLoadfunction () {
        audioBk.onCanplay(function(){
          setTimeout(function(){        
            console.log("播放就绪!:",audioBk.duration);
          }, 500);  //这里设置延时1秒获取  
        });
      },
      playMusic:function(){
        var that = this;
        audioBk.src = "***";
        audioBk.play();
        audioBk.onTimeUpdate(function(e){
          console.log("音频总时长:",audioBk.duration)
          console.log("当前播放时间",audioBk.currentTime)
          that.setData({
            curMMath.floor(audioBk.currentTime)
          });
        });
      },
      seekTap:function(e){
        let m = parseInt(e.currentTarget.dataset.m);
        this.setData({m:m});
        audioBk.seek(m);
      },
    })
    
    
    
    10-19
    有用
    回复
  • pro
    pro
    09-07

    需要拿2次,而且需要settimeout,而且还需要在onplay和oncanplay里面各拿一次。即可

    09-07
    有用
    回复
  • 吃鱼先生
    吃鱼先生
    07-15

    试试这么写?

    innerAudioContext.onCanplay(function get_duration() {
      if (innerAudioContext.duration) {
        // 做你想做的事情
          console.log(innerAudioContext.duration)
      } else {
        setTimeout(get_duration, 0)
      }
    })
    


    07-15
    有用
    回复 1
    • 大壞蛋
      大壞蛋
      07-15
      试过了,安卓不行
      07-15
      回复
登录 后发表内容
问题标签