uni.createInnerAudioContext踩坑duration在真机环境一直为0
解决 uni.createInnerAudioContext
的 duration
在真机环境一直为 0 的问题
在使用 uni.createInnerAudioContext
播放音频时,开发者可能会遇到以下问题:
duration
在真机环境中一直为 0:即使音频文件是正常的,duration
属性也无法正确获取音频的时长。- 音频实例未放到全局作用域:导致音频无法暂停、销毁等问题。
- 音频播放状态管理混乱:播放和暂停逻辑不一致,可能会出现多次播放或无法停止的问题。
本文将详细分析这些问题的原因,并提供解决方案。
问题 1:duration
在真机环境中一直为 0
原因分析
uni.createInnerAudioContext
的 duration
属性只有在音频文件可以播放时才会被正确赋值。如果音频文件未加载完成或加载失败,duration
将保持为 0。在真机环境中,音频加载速度较慢,可能需要一定时间才能获取到正确的时长。
解决方案
使用 onCanplay
事件监听音频文件是否可以播放,使用onCanplay之前先播放play(),并通过定时器轮询 duration
的值,直到其不为 0。
示例代码
let audio = uni.createInnerAudioContext();
audio.src = "音频文件路径"; // 设置音频文件路径
audio.play(); // 播放音频以便获取时长
audio.volume = 0; // 设置音量为 0,避免播放声音
audio.onCanplay(() => {let intervalID = setInterval(() => {if (audio.duration !== 0) {clearInterval(intervalID);