编程语言
首页 > 编程语言> > java – 在移植用libsndfile编写的C代码时,我应该在Android中使用什么?

java – 在移植用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.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()之类的东西会返回空列表.我可以深入研究包,看看它与提供商有关,但我不知道如何解决这个问题.获得我的流对象后,它会正确报告其编码等,这是令人鼓舞的.

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

解决方法:

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

标签:java,c-2,android,porting,libsndfile
来源: https://codeday.me/bug/20190626/1298388.html