移植用 libsndfile 编写的 C++ 代码时,我应该在 Android 中使用什么?

fre*_*ley 5 c++ java android porting libsndfile

我正在将一个小型(<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 );
Run Code Online (Sandbox Code Playgroud)

在 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));
Run Code Online (Sandbox Code Playgroud)

不起作用,但是我可以通过执行以下操作来解决此问题:

WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);
Run Code Online (Sandbox Code Playgroud)

通常,调用诸如AudioSystem.getAudioFileTypes()返回空列表之类的东西。我可以深入研究软件包,发现它与提供商有关,但我不知道如何解决这个问题。得到我的stream对象后,它确实正确报告了它的编码等,这令人鼓舞。

我目前的大问题是创建一个 Clip 对象。这需要使用 Line 对象创建,该对象通常来自 AudioSystem。任何人都可以想出办法解决这个问题吗?

Eri*_*opo 4

可以使用本机开发工具包为 Android 编译 libsndfile。一旦为 Android 编译了库,您应该能够使用 JNI 从 Java 访问它。