2

我正在尝试编写一个处理高分辨率 .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 代码的修改版本。同时,如果有人想要,请给我发消息。

4

2 回答 2

2

回复很晚,但其他人可能会从中受益。

现在存在一个libsndfile java 包装器,它应该有助于解决这样的音频读/写/转换问题。包装器(由 swig 生成)适用于 libsndfile API,因此结构与典型的 Java 风格略有不同,但完全可用。

在您的特定情况下,用法如下所示:

String filePath = "path/to/some/audio_8_channels.wav";

// open the sound file
SF_INFO sndInfo = new SF_INFO();
SWIGTYPE_p_SNDFILE_tag sndFile = libsndfile.sf_open(filePath, libsndfile.SFM_READ, sndInfo);

// create a buffer array large enough to hold all channels (double per channel) of all frames
int arraySize = sndInfo.getFrames() * sndInfo.getChannels();
CArrayDouble darray = new CArrayDouble(arraySize);

// read every frame (includes all channels) into the buffer array
long count = libsndfile.sf_readf_double(sndFile, darray.cast(), sndInfo.getFrames());

// iterate over the doubles that make up the audio
for (int i=0; i < arraySize; i++) {
    // every 8 doubles is a frame..
    double d = darray.getitem(i);
}

谷歌代码项目,包括在 Windows7 上为 JDK1.7 编译的“可用”版本存在于此处:

http://code.google.com/p/libsndfile-java/

于 2012-09-19T21:23:42.353 回答
1

您可以自己读取 wav 数据,实际上并不难。只需搜索 WAV 文件格式信息。

于 2011-06-23T17:52:06.740 回答