gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:17 24 4
gpt4 key购买 nike

我正在将一个小型(<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 后,项目编译,我可以毫无异常(exception)地创建 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。谁能想出解决办法?

最佳答案

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

关于java - 在移植用 libsndfile 编写的 C++ 代码时,我应该在 Android 中使用什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com