这是有关在最近的Android设备上捕获音频内容的问题。我正在开发一个必须记录未处理的麦克风音频的Android应用。在尝试解决该问题的过程中,我遇到了Android兼容性定义文档(CDD),从5.0版(API 21)开始,声明“声明android.hardware.microphone的设备实现必须允许捕获”。原始音频内容”(请参阅“录音”部分https://source.android.com/compatibility/cdd下的5.0或更高版本的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属性似乎很少可用时,必须可以捕获原始音频内容。我应该以不同的方式访问原始/未处理的音频内容吗?
谢谢!
答案 0 :(得分:0)
Android CDDs供打算将Android平台移植到其他设备/平台并保持应用程序开发人员的交叉兼容性的开发人员使用。这意味着标准的较低级别的Android库将能够访问CDD中定义的功能,但是您不一定能够。
我设法从androidcookbook.info找到了一个example here,该过程通过AudioRecord获得了原始的未压缩音频。
如果这不符合您的需求,那么我会100%建议您查看OpenSL ES(如果您尚未查看/使用它的话)。它使用NDK(在C ++中)提供本机接口,因此延迟大大降低,您可以使用更多功能进行音频处理。这是Google在GitHub上的audio-echo project,它显示了使用OpenSL ES的本机处理路径实时记录和回放的情况。
我确定您可以通过使用它来访问未压缩的音频。您可以根据需要在Java / C ++之间传递信息。