uniapp获取不到mp3的时长是什么原因
我在uniapp中使用音频组件播放mp3文件时,无法获取到正确的音频时长,返回的duration始终为0。已经确认音频文件本身是正常的,在其他平台可以正常获取时长。想请教下可能是什么原因导致的?需要如何解决?
        
          2 回复
        
      
      
        可能是以下原因:
- 音频文件未加载完成,建议在canplay事件中获取
- 使用uni.createInnerAudioContext()创建音频对象
- 确保音频文件路径正确
- 部分平台对音频格式支持有限,建议使用标准MP3格式
在Uniapp中获取MP3音频时长失败,常见原因及解决方案如下:
主要原因
- 音频文件未加载完成
- 跨域问题(H5平台)
- 文件路径问题
- 平台兼容性差异
解决方案
1. 确保音频正确加载
// 创建音频上下文
const audioContext = uni.createInnerAudioContext();
audioContext.src = '音频文件路径';
// 等待元数据加载完成
audioContext.onCanplay(() => {
  // 此时可以获取时长
  console.log('音频时长:', audioContext.duration);
});
// 错误处理
audioContext.onError((error) => {
  console.error('音频加载失败:', error);
});
2. 处理跨域问题(H5平台)
- 确保音频文件支持跨域访问
- 服务器配置CORS头部
3. 检查文件路径
- 网络路径:http://或https://
- 本地路径:使用相对路径或绝对路径
- 平台路径差异:注意各平台路径规范
4. 完整示例代码
getAudioDuration(src) {
  return new Promise((resolve, reject) => {
    const audio = uni.createInnerAudioContext();
    audio.src = src;
    
    audio.onCanplay(() => {
      // 延迟获取确保时长数据就绪
      setTimeout(() => {
        if (audio.duration > 0) {
          resolve(audio.duration);
        } else {
          reject('无法获取音频时长');
        }
        audio.destroy();
      }, 500);
    });
    
    audio.onError((err) => {
      reject('音频加载失败: ' + err.errMsg);
      audio.destroy();
    });
  });
}
// 使用示例
this.getAudioDuration('your-audio.mp3')
  .then(duration => {
    console.log('音频时长:', duration);
  })
  .catch(error => {
    console.error(error);
  });
5. 注意事项
- 部分平台可能需要用户交互后才能播放音频
- 确保音频文件格式兼容
- 真机调试时检查网络连接
通过以上方法通常可以解决获取MP3时长的问题。
 
        
       
                     
                   
                    

