【问题标题】:What should I use in Android when porting C++ code written with libsndfile?移植用 libsndfile 编写的 C++ 代码时,我应该在 Android 中使用什么?
【发布时间】:2011-05-02 03:03:08
【问题描述】:

我正在将一个小型(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 对象而不会引发任何异常。我还没有机会玩太多,但我会及时通知你。

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

AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));

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

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

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

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

【问题讨论】:

  • 我找到了the micdroid code on github,它看起来大约是我需要的一半,将做更多的搜索以寻找类似的开源应用程序......

标签: java c++ android porting libsndfile


【解决方案1】:

你为什么不把这段代码保存在 C++ 中,然后通过JNI 在你的 Java 中调用它?

【讨论】:

  • 对不起,应该放一个 Android 标签,我实际上正在移植到 Android,这(根据我的研究)使 JNI 的东西更加可怕。这也是我最后一年项目的一部分,这是我说过我会在我的项目中做的事情之一,未来项目的工作可能会包含这个结果,所以复杂性越少越好。跨度>
【解决方案2】:

可以使用本机开发工具包为 Android 编译 libsndfile。一旦你为 Android 编译了这个库,你应该可以使用 JNI 从 Java 中访问它。

【讨论】:

  • 试试 libsndfile-devel 邮件列表。那里至少有一个人这样做了。
【解决方案3】:

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

【讨论】:

  • 查看我对 Amir 帖子的评论,这是我必须为我最后一年的项目完成的编程工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多