使用Android NDK录制音频

3

我想使用Android NDK录制音频。有人说我可以使用“frameworks/base/media/libmedia/AudioRecord.cpp”,但它在内核中。我该如何访问和使用它?

3个回答

9

C++ libmedia库不属于公共API的一部分。有些人使用它,但极其不建议这样做,因为它可能在某些设备上或未来的Android版本中出现问题。

我开发了一款音频录制应用程序,相信我,在各种设备上,音频支持非常不一致,这很棘手,所以在我看来,直接使用libmedia是一个不好的选择。

使用公共API捕获原始音频的唯一方法是使用Java AudioRecord类。它会给你PCM数据,然后您可以选择将其传递给您的C优化例程。

另外,虽然有点困难,但您可以编写一个围绕Java AudioRecord类的C/C++包装器,因为可以通过JNI实例化Java对象并调用方法。


4
这个答案已经过时。 建议在Android NDK中使用OpenSL ES多媒体框架。 - sweisgerber.dev

4

可能有点过时,但:

  1. 在本地代码中播放/录制音频的最安全方法是使用OpenSL ES接口。 然而,它仅适用于Android 2.3+,目前仍需要通过通用AudioFlinger API运行。

  2. 更强大且简单的方法是使用平台源代码获取AudioFlinger头文件和一些用于链接构建阶段的通用libmedia.so。 设备相关的libmedia.so应该在应用程序初始化阶段预加载以使AudioFlinger正常工作(通常会自动完成)。请注意,一些供应商尝试更改AudioFlinger内部(由于不明原因),所以您可能会遇到一些内存或行为问题。

在我的经验中,AudioFlinger在所有(2.0+)设备上都可以工作,但有时需要为对象分配比默认实现更多的内存。

最后,OpenSL ES是一个包装器,具有可动态加载的C接口,允许将其与任何特定的AudioFlinger实现一起使用。对于简单的使用来说,它相当复杂,并且可能比使用Java AudioTrack/AudioRecord还要耗费更多的开销,因为涉及内部线程、缓冲等。 因此,在Google实现某些高性能音频接口之前,请考虑使用Java或不太安全的本地AudioFlinger(这在目前看来是不可靠的)。


2

从Android 2.3(API-Level 9)开始,可以使用OpenSL Es API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接