用Java读取wav文件

Posted

技术标签:

【中文标题】用Java读取wav文件【英文标题】:Reading wav file in Java 【发布时间】:2011-07-09 18:29:18 【问题描述】:

我想用 Java 读取 wav 文件,我打算用 K-means 对它们进行分类。

如何在 Java 中读取 wav 文件并将它们分配到数组或类似的东西(您可以提出建议)以对它们进行分类?

编辑:我想使用 API 来读取 wav 文件和 K-means。

【问题讨论】:

我认为thread 将帮助您入门。 【参考方案1】:

官方Java Sound Programmer Guide遍历reading和writing音频文件。

A Greensted 的这篇文章:Reading and Writing Wav Files in java 应该会有所帮助。 WavFile 类非常有用,可以对其进行调整以返回整个数据数组而不是缓冲片段。

【讨论】:

【参考方案2】:

相当于matlab的wavread函数:

http://web.archive.org/web/20120531113946/http://www.builogic.com/java/javasound-read-write.html

【讨论】:

【参考方案3】:

您可以使用 javax 声音库和 FileInputStream 读取声音文件 (found a nice example here) 并将波形文件视为位 (0,1) 或字节的向量。使用多序列对齐 (Wiki) 在每个位/字节流之间创建一个距离矩阵,从那里开始,聚类应该是直截了当的.

问题是,这种方法对噪音等非常敏感,但值得一试...

【讨论】:

做一些降噪和下采样可能是个好主意。 +1。【参考方案4】:

不确定这是否会对某人有所帮助。 Java JDK 已经提供了Audiosystem 类。

我在测试中使用它来检查生成的 WAV 属性,

AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat(new File(response.get()));
assertEquals(1, audioFileFormat.getFormat().getChannels());
assertEquals(8000.0, audioFileFormat.getFormat().getSampleRate(), 0.0f);
assertEquals(8, audioFileFormat.getFormat().getSampleSizeInBits());

【讨论】:

【参考方案5】:

我做了一些研究,发现了很多读取 wav 文件的方法。我认为从特定文件夹读取 wav 文件的最简单方法是:

private final String directoryOfSamples = "./res/semplai";
private ArrayList<File> samplesArray = new ArrayList<File>();
private final File folder = new File(directoryOfSamples);


public ReadSample()


    samplesArray.addAll(Arrays.asList(folder.listFiles()));
    testSample(getSamplesArray().get(0)); // testing if sample can be played from arrayList

我希望这对某些人有所帮助。 如果您有不明白的地方,请告诉我。

【讨论】:

这是什么黑客行为? getSamplesArray() 有什么作用?这是什么?

以上是关于用Java读取wav文件的主要内容,如果未能解决你的问题,请参考以下文章

Java 读取/操作 Wav 文件

怎样用matlab分割音频文件(wav)或其他

用c或c++播放wav文件,怎么实现

java读取本地或者网络wav音频文件的时长

如何在java中将Wav文件拆分为通道?

Qt ------ WAV 音频文件介绍