必须手动解析WAV二进制头以获取fmt块扩展字段和fact块数据;需用RandomAccessFile按RIFF规范逐块读取,注意小端序,并根据cbSize动态处理扩展字段。

Java读取WAV文件头需要绕过AudioSystem的封装
Java标准库的 AudioSystem.getAudioFileFormat() 对WAV支持有限——它能返回采样率、位深、声道数等基础信息,但**不暴露WAV特有的fmt块字段(如cbSize、validBitsPerSample、channelMask)或fact块数据**。要获取完整头参数,必须手动解析RIFF/WAV二进制结构。
WAV头解析的关键是按RIFF规范逐块读取
WAV本质是RIFF容器格式,头部由"RIFF"标识开头,后跟文件总大小,接着是"WAVE"标识,然后是若干子块("fmt "、"fact"、"data"等)。每个块结构为:4字节ID + 4字节长度 + N字节内容。手动解析时需严格按字节顺序读取,且注意小端序(little-endian)。
常见踩坑点:
-
AudioInputStream会跳过"fmt "块前的RIFF头,直接定位到音频数据起始,无法回溯读取原始头 - 用
DataInputStream.readInt()读取长度字段时,若未确认字节序,会导致数值错误(例如读出0x12345678却解析成2018915346) - 忽略
"fmt "块长度字段(cbSize),直接按固定16字节解析,会漏掉扩展字段(如WAVE_FORMAT_EXTENSIBLE下的channelMask)
用RandomAccessFile安全读取WAV头字段
相比FileInputStream,RandomAccessFile可自由定位、避免流提前消耗,更适合头解析。重点字段提取逻辑如下:
validBitsPerSample
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











