收藏
回答

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

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

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

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

16 个回答

  • 夏末丿
    夏末丿
    2020-08-05

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

    2020-08-05
    有用 4
    回复 1
    • Derry
      Derry
      2023-12-20
      可以用楼主的办法,正常要播放的innerAudioContext不配置CanPlay,new 一个backup的音频对象,让它播放的时候去 setInterval 取值
      2023-12-20
      回复
  • 红豆咖啡
    红豆咖啡
    2020-08-04

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

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

    2020-08-04
    有用 4
    回复
  • Dust_2
    Dust_2
    2021-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真的是蛋疼。
    
    2021-01-04
    有用 3
    回复 2
    • 2021-10-07
      emm 调用第100次 没有拿到
      2021-10-07
      回复
    • 科技改变生活
      科技改变生活
      2022-11-15
      计时器也有bug不能销毁
      2022-11-15
      回复
  • pro
    pro
    2020-09-07

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

    2020-09-07
    有用 3
    回复
  • 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
    回复 2
    • 情不知灬所以
      情不知灬所以
      2021-03-03
      你说的这种办法根本就没有用,音频文件从哪获取的,大家都是从后台获取的,就像你使用QQ音乐,从QQ音乐后台获取的音频,你自己拿音乐编辑软件编辑一下??一万首音乐你自己都重新编辑一下???
      2021-03-03
      1
      回复
    • 好好学习,阳光积极向上
      好好学习,阳光积极向上
      2023-11-23
      同一音频文件,为什么iOS没这问题呢???
      2023-11-23
      回复
  • 哈哈
    哈哈
    2021-01-15

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

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

    通过云函数获取

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

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

    下面是新的方案

    2020-10-23
    有用 1
    回复
  • momo
    momo
    11-13
      const getDuration = async (): Promise<number> => {
        return new Promise(resolve => {
          // 创建备份,静音播放,获取时长
          const audioBackup = Taro.createInnerAudioContext()
          audioBackup.src = src
          audioBackup.volume = 0
          audioBackup.play()
          audioBackup.onPlay(() => {
            // 3秒后销毁备份,防止onTimeUpdate中获取不到时长,一直在执行
            const timer = setTimeout(() => {
              audioBackup.stop()
              audioBackup.destroy()
              clearTimeout(timer)
            }, 3000)
          })
          audioBackup.onTimeUpdate(() => {
            if (audioBackup.duration) {
              resolve(audioBackup.duration)
              audioBackup.stop()
              audioBackup.destroy()
            }
          })
        })
      }
    
    audio.onCanplay(async () => {
          if (audio.duration) {
                // ios 可以直接获取到时长
            setDuration(audio.duration)
          } else {
            // 安卓在不播放音频的时候获取不到时长
            const duration = await getDuration()
            setDuration(duration)
          }
        })
    


    11-13
    有用
    回复
  • 疯子
    疯子
    2022-03-14

    获取录音时长duration坑得一匹,不过算是解决了,提供一个解决方案。

    1、使用downloadFile下载录音到本地,src设置为微信缓存地址(tempFilePath)

    2、onCanplay主动播放一次,用play方法,记得把volume设置成0

    3、onTimeUpdate获取时长,这时候就能获取到了。

    4、获取时长后,用pause、stop重置录音播放进度。volume重置成1。

    2022-03-14
    有用
    回复
  • 情不知灬所以
    情不知灬所以
    2021-03-03

    2021-03-03
    有用
    回复

正在加载...

登录 后发表内容
问题标签