小程序
小游戏
企业微信
微信支付
扫描小程序码分享
问题如题,此问题存在至少一年以上,论坛全是问这个,都是问要代码片段就没有然后了,别问我要代码片段了,论坛里到处都是,这bug就解决不了了吗?
15 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
这个可以,onCanplay在安卓上要进入播放状态才取得到值,ios就不用,不知道为啥,是官方的bug嘛??
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
在安卓上面,我也遇到这个问题,我找到一个解决方法。
因为调用 play()方法时,可以获取到时长,所以初始化时调用一次play()方法,最后再调用暂停方法,可以解决这个问题,在这获取之前,页面可以加一个loading过渡
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真的是蛋疼。
需要拿2次,而且需要settimeout,而且还需要在onplay和oncanplay里面各拿一次。即可
我最近遇到了类似的问题,事实上是音频本身的问题。大家可以参考一下。
duration这个参数实际上是音频文件自带的媒体信息,小程序使用的接口只是简单地把该信息读取出来。如果音频文件本身没有duration信息,则获取到0.
1,查看音频文件是否自带duration信息。用MPC-HC打开音频文件,或用其他播放器打开。点击属性并查看媒体信息,可以看到没有duration信息:
2,用音频编辑软件转换一下音频,比如调整一下采样率等等(我用的是BatchEncoder,一个开源音频转换软件)。转换后的文件duration信息就被添加到媒体信息了,其他媒体信息也发生了一些变化:
3,此时在小程序中就可以正确获取duration了。
我注意到虽然音频文件没有duration,但是在电脑上用播放软件播放时也能正确获取音频时长。猜测原因是播放软件在duration缺失时,有自己的机制通过音频本身获取媒体信息。但是小程序使用的接口比较简单吧,duration缺失时返回个默认值0就完事儿了。
你们提供可以的代码片段也延时获取不了,从2021年1月14号开始就不行。看下是不是又改出了新bug,实在不行,就回滚吧。至少之前的版本延时可以获取
通过云函数获取
-------------更新--------------
以上方法不是很稳定,对远程url偶尔报错
下面是新的方案
获取录音时长duration坑得一匹,不过算是解决了,提供一个解决方案。
1、使用downloadFile下载录音到本地,src设置为微信缓存地址(tempFilePath)
2、onCanplay主动播放一次,用play方法,记得把volume设置成0
3、onTimeUpdate获取时长,这时候就能获取到了。
4、获取时长后,用pause、stop重置录音播放进度。volume重置成1。
const audioContext = wx.createInnerAudioContext(); const loadDuration = function () { setTimeout(() => { if (audioContext.duration === 0) { loadDuration(); } else { // 获取到正确的duration } }, 100); }; audioContext.onCanplay(loadDuration);
正在加载...
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
这个可以,onCanplay在安卓上要进入播放状态才取得到值,ios就不用,不知道为啥,是官方的bug嘛??
在安卓上面,我也遇到这个问题,我找到一个解决方法。
因为调用 play()方法时,可以获取到时长,所以初始化时调用一次play()方法,最后再调用暂停方法,可以解决这个问题,在这获取之前,页面可以加一个loading过渡
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真的是蛋疼。
需要拿2次,而且需要settimeout,而且还需要在onplay和oncanplay里面各拿一次。即可
我最近遇到了类似的问题,事实上是音频本身的问题。大家可以参考一下。
duration这个参数实际上是音频文件自带的媒体信息,小程序使用的接口只是简单地把该信息读取出来。如果音频文件本身没有duration信息,则获取到0.
1,查看音频文件是否自带duration信息。用MPC-HC打开音频文件,或用其他播放器打开。点击属性并查看媒体信息,可以看到没有duration信息:
2,用音频编辑软件转换一下音频,比如调整一下采样率等等(我用的是BatchEncoder,一个开源音频转换软件)。转换后的文件duration信息就被添加到媒体信息了,其他媒体信息也发生了一些变化:
3,此时在小程序中就可以正确获取duration了。
我注意到虽然音频文件没有duration,但是在电脑上用播放软件播放时也能正确获取音频时长。猜测原因是播放软件在duration缺失时,有自己的机制通过音频本身获取媒体信息。但是小程序使用的接口比较简单吧,duration缺失时返回个默认值0就完事儿了。
你们提供可以的代码片段也延时获取不了,从2021年1月14号开始就不行。看下是不是又改出了新bug,实在不行,就回滚吧。至少之前的版本延时可以获取
通过云函数获取
-------------更新--------------
以上方法不是很稳定,对远程url偶尔报错
下面是新的方案
获取录音时长duration坑得一匹,不过算是解决了,提供一个解决方案。
1、使用downloadFile下载录音到本地,src设置为微信缓存地址(tempFilePath)
2、onCanplay主动播放一次,用play方法,记得把volume设置成0
3、onTimeUpdate获取时长,这时候就能获取到了。
4、获取时长后,用pause、stop重置录音播放进度。volume重置成1。
const audioContext = wx.createInnerAudioContext(); const loadDuration = function () { setTimeout(() => { if (audioContext.duration === 0) { loadDuration(); } else { // 获取到正确的duration } }, 100); }; audioContext.onCanplay(loadDuration);