uniapp获取不到mp3的时长是什么原因

我在uniapp中使用音频组件播放mp3文件时,无法获取到正确的音频时长,返回的duration始终为0。已经确认音频文件本身是正常的,在其他平台可以正常获取时长。想请教下可能是什么原因导致的?需要如何解决?

2 回复

可能是以下原因:

  1. 音频文件未加载完成,建议在canplay事件中获取
  2. 使用uni.createInnerAudioContext()创建音频对象
  3. 确保音频文件路径正确
  4. 部分平台对音频格式支持有限,建议使用标准MP3格式

在Uniapp中获取MP3音频时长失败,常见原因及解决方案如下:

主要原因

  1. 音频文件未加载完成
  2. 跨域问题(H5平台)
  3. 文件路径问题
  4. 平台兼容性差异

解决方案

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时长的问题。

回到顶部