我正在尝试编写一个处理高分辨率 .wav 文件的 Java 应用程序。我在导入音频数据时遇到问题,即将 .wav 文件转换为双精度数组。
当我使用标准方法时,会引发异常。
AudioFileFormat as = AudioSystem.getAudioFileFormat(new File("orig.wav"));
-->
javax.sound.sampled.UnsupportedAudioFileException: file is not a supported file type
这是根据 soxi 的文件格式信息:
dB$ soxi orig.wav
soxi WARN wav: wave header missing FmtExt chunk
Input File : 'orig.wav'
Channels : 8
Sample Rate : 96000
Precision : 24-bit
Duration : 00:00:03.16 = 303526 samples ~ 237.13 CDDA sectors
File Size : 9.71M
Bit Rate : 24.6M
Sample Encoding: 32-bit Floating Point PCM
任何人都可以建议将此音频导入 Java 的最简单方法吗?
我尝试过使用一些技术。如上所述,我已经尝试过 Java AudioSystem(在 Mac 和 Windows 上)。我也尝试过使用 Andrew Greensted 的WavFile 类,但这也失败了(WavFileException:不支持压缩代码 3)。一种解决方法是使用 sox(带有 -b 16 标志)将音频转换为 16 位,但这是次优的,因为它会增加本底噪声。
顺便说一句,我注意到该文件可以由 libsndfile 读取。我最好的选择是围绕 libsndfile 编写一个 jni 包装器,还是你能提出更快的建议?
请注意,我不需要播放音频,我只需要对其进行分析、操作,然后将其写入新的 .wav 文件即可。
* 更新 *
我通过修改 Andrew Greensted 的WavFile 类解决了这个问题。他的原始版本只读取编码为整数值的文件(“格式代码 1”);我的文件被编码为浮点数(“格式代码 3”),这就是导致问题的原因。
当我有机会时,我会发布 Greensted 代码的修改版本。同时,如果有人想要,请给我发消息。