如何使用JavaScript获取音频文件sample rate(采样率)并解决返回固定值问题
问题分析
- 你当前代码拿到固定采样率的核心原因是 Web Audio API 中的
decodeAudioData存在重采样默认逻辑:该方法会自动将所有输入音频重采样为当前 AudioContext 绑定的系统音频输出设备的采样率,因此返回值永远和你的设备采样率一致,和源文件无关。
可行解决方案
有两类实现方案可以拿到源文件的真实采样率:
方案1:直接解析音频文件二进制头(推荐)
不需要依赖任何第三方库,也不需要加载完整音频文件,仅读取文件头部的元数据字段即可获得原始采样率,性能高、无重采样问题。
以下是支持WAV格式的示例代码,可根据需求扩展MP3、AAC等其他格式的解析逻辑:
function getRawSampleRate(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); // 仅读取WAV文件头的44字节,无需加载全量文件 reader.readAsArrayBuffer(file.slice(0, 44)); reader.onload = () => { const dataView = new DataView(reader.result); // 校验WAV文件标识 const head1 = dataView.getUint32(0, false); const head2 = dataView.getUint32(8, false); if (head1 !== 0x52494646 || head2 !== 0x57415645) { return reject(new Error('当前仅支持WAV格式,可扩展其他格式解析逻辑')); } // 读取WAV头中24-27字节的采样率字段(小端序) const sampleRate = dataView.getUint32(24, true); resolve(sampleRate); }; reader.onerror = reject; }); } // 调用方式 getRawSampleRate(e.files[0]) .then(rate => console.log('源文件采样率:', rate)) .catch(err => console.log(err));
不同音频格式的采样率存储位置可参考对应格式的官方规范,按需补充解析逻辑即可覆盖所有常用音频格式。
方案2:使用前端音频元数据解析库
如果需要快速支持多格式解析,可以直接使用成熟的前端音频元数据解析工具,这类工具底层也是通过二进制解析文件头实现,不会触发Web Audio API的重采样逻辑,适配性更好。
内容的提问来源于stack exchange,提问作者phpLover
相关产品推荐
相关产品推荐

