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



这是一个关于在最近的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 CDD适用于打算将Android平台移植到其他设备/平台并为应用程序开发人员保持交叉兼容性的开发人员。这意味着标准的、较低级别的Android库将能够访问CDD中定义的功能,但你不一定能够。

我在androidcookbook.info中找到了一个通过AudioRecord获取原始、未压缩音频的例子。

如果这不适合你的需求,那么如果你还没有看过/使用过OpenSL ES,我会100%建议你去看看。它使用NDK(在C++中(来提供本机接口,因此延迟要低得多,并且您可以访问更多的音频处理功能。这是谷歌在GitHub上的音频回声项目,它显示了使用OpenSL ES.的本地处理路线实时录制和播放

我相信你可以使用它访问未压缩的音频。你可以根据自己的意愿在Java/C++之间传递信息。

最新更新