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

Mik*_*her 5 audio android microphone

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

\n\n

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

\n\n

Here\xe2\x80\x99s 我需要帮助:我对以下事实感到困惑:CDD 表明必须允许捕获原始数据,而 MediaRecorder 并不总是允许访问它。也许 \xe2\x80\x9craw\xe2\x80\x9d 与 \xe2\x80\x9cunprocessed\xe2\x80\x9d 不一样?或者这可能意味着原始/未处理的音频数据仅用于系统级功能,第三方开发人员无法使用。

\n\n

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

\n\n

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

\n\n

提前致谢!

\n

Woo*_*Dev 4

Android CDD适用于想要将 Android 平台移植到其他设备/平台并维护应用程序开发人员的交叉兼容性的开发人员。这意味着标准的较低级别 Android 库将能够访问 CDD 中定义的功能,但您不一定能够。

我设法从 androidcookbook.info 找到了一个示例,该示例通过AudioRecord获取原始、未压缩的音频。

如果这不能满足您的需求,那么如果您还没有看过/使用过OpenSL ES,我将 100% 建议您查看它。它使用 NDK(C++ 语言)提供本机接口,因此延迟要低得多,并且您可以访问更多音频处理功能。这里是 GitHub 上的 google音频回声​​项目,该项目展示了使用 OpenSL ES 的本机处理路径进行实时录制和播放。

我确信您可以使用它来访问未压缩的音频。您可以根据需要在 Java / C++ 之间传递信息。