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

我正在将一个小的(<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对象而不会抛出任何exception。 我没有机会玩很多但我会告诉你更新。

编辑4好的,有些东西似乎适用于javax.sound.sampled,有些则不适用。 例如,调用如:

 AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile)); 

不行,但是我可以通过这样做来解决这个问题:

 WaveFileReader wfr = new WaveFileReader(); AudioInputStream stream = wfr.getAudioInputStream(waveFile); 

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

我目前最大的问题是创建一个Clip对象。 这需要使用Line对象创建,该对象通常来自AudioSystem。 谁能想到解决这个问题的方法?

可以使用Native Development Kit为Android编译libsndfile。 在为Android编译库之后,您应该能够使用JNI从Java访问它。

为什么不将这些代码保存在C ++中并通过JNI在Java中调用它?

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