我正在将一个小型(<10 类)C++ 项目移植到 Java。该项目处理声音文件,在 C++ 中使用libsndfile进行此操作。该代码包括以下内容:
const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, ¤tAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );
在 Java 中,在低级别操作声音文件的最佳方法是什么?我说的是规范化、添加回声等内容。
进度报告
经过一番挖掘,我发现了javax.sound.sampled,看起来它可能会完成这项工作。
编辑 2仔细检查后,它不起作用(或至少不能以任何可用的方式),因为它依赖于com.sun.sound
包。
编辑 3在更多的检查和实验中,com.sun.sound
和sun.misc
包是在 GNU GPLv2 下发布的,我已经将它们下载到我的项目中。重命名javax.sound.sampled
为 后imp.javax.sound.sampled
,项目编译,我可以创建AudioFileFormat
对象而不会引发任何异常。我还没有机会玩太多,但我会及时通知你。
编辑 4好的,有些东西似乎适用于 javax.sound.sampled,有些则不适用。例如,调用如下:
AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));
不起作用,但是我可以通过以下方式解决此问题:
WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);
通常,调用诸如AudioSystem.getAudioFileTypes()
返回空列表之类的东西。我可以深入研究这些软件包,看看它与提供商有关,但我不知道如何解决这个问题。得到我的stream
对象后,它确实正确地报告了它的编码等,这是令人鼓舞的。
目前我最大的问题是创建一个 Clip 对象。这需要使用 Line 对象创建,该对象通常来自 AudioSystem。谁能想到解决这个问题的方法?