在 Android 台设备上捕获未处理/原始麦克风数据

Capturing unprocessed / raw microphone data on Android devices

这是一个关于在最近的 Android 设备上捕获音频内容的问题。我正在开发一个必须记录未经处理的麦克风音频的 Android 应用程序。在试图弄清楚如何实现这一点的过程中,我遇到了 Android 兼容性定义文档 (CDD),自版本 5.0 (API 21) 以来,它声明“声明的设备实现android.hardware.microphone 必须允许捕获原始音频内容 [...]”(请参阅​​ 5.0 及更高版本的任何 CDD,在音频记录部分下:https://source.android.com/compatibility/cdd)。

另一方面,我发现有几个音频源可以在 MediaRecorder API 下 selected 并且为了“录制原始音频 select 未处理。某些设备不支持未处理的输入。首先调用 AudioManager.getProperty(AudioManager.PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED) 以验证它是否可用”(来源:https://developer.android.com/guide/topics/media/mediarecorder)。 PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED 属性 添加到 API 24.

这是我需要帮助的地方:我对 CDD 指示必须允许捕获原始数据而 MediaRecorder 并不总是允许访问它这一事实感到困惑。也许是“原始”与“未加工”不同?或者这可能意味着 raw/unprocessed 音频数据仅用于系统级功能,第三方开发人员无法使用。

请注意,当我测试以验证未处理的 属性 是否可用于 3 种不同的 Android 设备(包括带有 API 26 的 Galaxy S8)时,我从未得到积极的结果。

这就是说,有人可以澄清为什么 CDD 指示原始音频内容的捕获必须可用,而未处理的 AudioMagager API 属性 似乎很少可用。我应该以不同的方式访问 raw/unprocessed 音频内容吗?

提前致谢!

Android CDDs 适用于打算将 Android 平台移植到其他 devices/platforms 平台并为应用程序开发人员保持交叉兼容性的开发人员。这意味着标准的、较低级别的 Android 库将能够访问 CDD 中定义的功能,但您不一定能够。

我设法找到了 example here from androidcookbook.info that goes through getting raw, uncompressed audio via AudioRecord

如果这不符合您的需求,那么我 100% 建议您查看 GitHub 上的 OpenSL ES if you haven't looked at/used it yet. It uses the NDK (in C++) to provide a native interface so latency is much lower and you have access to more functionality for audio processing. Here' google's audio-echo project,它使用 OpenSL ES 的本机处理路径实时显示录制和回放。

我相信您可以通过使用它来访问未压缩的音频。您可以根据需要将信息传入和传出 Java / C++。