在移植使用libsndfile编写的C ++代码时,我应该在Android中使用什么?
我正在将一个小的(<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
对象而不会抛出任何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?