【问题标题】:Capturing unprocessed / raw microphone data on Android devices在 Android 设备上捕获未处理/原始麦克风数据
【发布时间】:2018-07-19 21:16:49
【问题描述】:

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

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

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

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

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

提前致谢!

【问题讨论】:

  • 仅仅因为它必须提供原始数据并不意味着操作系统需要将它提供给用户。必须由框架/操作系统内部使用

标签: android audio microphone


【解决方案1】:

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

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

如果这不符合您的需求,那么我 100% 建议您查看OpenSL ES(如果您尚未查看/使用它)。它使用 NDK(在 C++ 中)提供本机接口,因此延迟要低得多,并且您可以访问更多的音频处理功能。这是 GitHub 上 google 的 audio-echo project,它显示了使用 OpenSL ES 的本机处理路径实时录制和回放。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多