我正在将一个小的(少于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
对象而不会引发任何异常。我还没有机会玩很多游戏,但我会及时通知您。
编辑4好的,有些事情似乎可以与javax.sound.sampled一起使用,而有些则不能。例如,诸如以下的调用:
AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));
不起作用,但是我可以通过以下方法解决此问题:
WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);
通常,对诸如此类的调用将AudioSystem.getAudioFileTypes()
返回空列表。我可以深入研究软件包,并发现它与提供程序有关,但是我无所适从。得到我的stream
对象后,它会正确报告其编码等,这令人鼓舞。
目前,我的大问题是创建一个Clip对象。这需要使用Line对象创建,该对象通常来自AudioSystem。谁能想到解决这个问题的方法?
可以使用本机开发套件为Android编译libsndfile。一旦为Android编译了库,就应该能够使用JNI从Java访问它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句