收藏
回答

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

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

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

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

14 个回答

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

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


    2020-07-15
    有用
    回复 13
    查看更多(8)
  • Dust_187J3X1
    Dust_187J3X1
    01-04
    innerAudioContext.onCanplay(function getDuration() {
              let intervalID = setInterval(function() {
                console.log('onCanplay', innerAudioContext.duration)
                if (innerAudioContext.duration !== 0) {
                  that.duration = Math.ceil(innerAudioContext.duration);
                  clearInterval(intervalID);
                }
              }, 500);
    我最后采用的这种方法,基本上在第二次调用时就能拿到正确的值了。小程序这个bug真的是蛋疼。
    
    01-04
    有用 2
    回复
  • Yan Lu
    Yan Lu
    2020-12-10

    我最近遇到了类似的问题,事实上是音频本身的问题。大家可以参考一下。

    duration这个参数实际上是音频文件自带的媒体信息,小程序使用的接口只是简单地把该信息读取出来。如果音频文件本身没有duration信息,则获取到0.

    1,查看音频文件是否自带duration信息。用MPC-HC打开音频文件,或用其他播放器打开。点击属性并查看媒体信息,可以看到没有duration信息:

    2,用音频编辑软件转换一下音频,比如调整一下采样率等等(我用的是BatchEncoder,一个开源音频转换软件)。转换后的文件duration信息就被添加到媒体信息了,其他媒体信息也发生了一些变化:

    3,此时在小程序中就可以正确获取duration了。

    我注意到虽然音频文件没有duration,但是在电脑上用播放软件播放时也能正确获取音频时长。猜测原因是播放软件在duration缺失时,有自己的机制通过音频本身获取媒体信息。但是小程序使用的接口比较简单吧,duration缺失时返回个默认值0就完事儿了。

    2020-12-10
    有用 2
    回复 1
    • Owen
      Owen
      03-03
      你说的这种办法根本就没有用,音频文件从哪获取的,大家都是从后台获取的,就像你使用QQ音乐,从QQ音乐后台获取的音频,你自己拿音乐编辑软件编辑一下??一万首音乐你自己都重新编辑一下???
      03-03
      回复
  • pro
    pro
    2020-09-07

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

    2020-09-07
    有用 2
    回复
  • 夏末丿
    夏末丿
    2020-08-05

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

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

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

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

    2020-08-04
    有用 2
    回复
  • 海-WHeeL
    海-WHeeL
    01-15

    你们提供可以的代码片段也延时获取不了,从2021年1月14号开始就不行。看下是不是又改出了新bug,实在不行,就回滚吧。至少之前的版本延时可以获取

    01-15
    有用 1
    回复
  • 3
    3
    2020-10-23

    通过云函数获取

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

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

    下面是新的方案

    2020-10-23
    有用 1
    回复
  • Owen
    Owen
    03-03

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

正在加载...

登录 后发表内容
问题标签