5

我正在将一个小型(<10 类)C++ 项目移植到 Java。该项目处理声音文件,在 C++ 中使用libsndfile进行此操作。该代码包括以下内容:

const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, &currentAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );

在 Java 中,在低级别操作声音文件的最佳方法是什么?我说的是规范化、添加回声等内容。

进度报告

经过一番挖掘,我发现了javax.sound.sampled,看起来它可能会完成这项工作。

编辑 2仔细检查后,它不起作用(或至少不能以任何可用的方式),因为它依赖于com.sun.sound包。

编辑 3在更多的检查和实验中,com.sun.soundsun.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。谁能想到解决这个问题的方法?

4

3 回答 3

4

可以使用 Native Development Kit 为 Android 编译 libsndfile。一旦你为 Android 编译了这个库,你应该能够使用 JNI 从 Java 访问它。

于 2010-10-29T00:44:34.380 回答
0

你为什么不把这段代码保存在 C++ 中并通过JNI在你的 Java 中调用它呢?

于 2010-10-28T21:52:47.317 回答
0

如果您可以使用 NDK 移植 libsndfile,为什么不直接使用 NDK 来移植您的 C++ 代码,而不必担心将其移植到 java?

于 2010-11-08T04:59:06.123 回答