在Android上捕获原始麦克风输入

时间:2014-08-18 14:45:57

标签: android audio microphone voice-recognition audiorecord

我在android中使用AudioRecord类。在我的应用程序中,我想测量头戴式麦克风捕获的声音,而无需预滤波或均衡。我知道要达到这个结果,我必须正确设置AudioRecord会话的音频源,但在不同的设备上尝试我的代码,我想出了不同的结果。例如,使用Galaxy Note 3,我设法用MediaRecorder.AudioSource.VOICE_RECOGNITION记录原始麦克风数据,同时使用MediaRecorder.AudioSource.MIC我最终得到了滤波。另一方面,对于Galaxy s4,我不得不反向工作。我的错误在哪里?有没有一种独特的方式可以访问麦克风的原始数据? 这是我用来初始化audiorecord实例的代码行:

                recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recordBufferSize);

P.S。:在我的所有尝试中,我关闭了设置页面上可用的所有声音预均衡。我也尝试使用MediaRecorder.AudioSource.DEFAULT但它没有改变任何东西。

2 个答案:

答案 0 :(得分:0)

您现在可以使用MediaRecorder.AudioSource.UNPROCESSED。这应始终提供来自麦克风的未处理信号。请注意,正如WoodyDev指出的那样,并非所有设备都支持此功能。

有关更多信息,请参见the Android docs

答案 1 :(得分:0)

OpenSL ES

为了尽可能接近未处理的音频,我认为Android NDK中的OpenSL ES API规范是最佳选择。 Google提供example project的实时记录和回放(为避免反馈会有所延迟)。

这是AudioRecorder的基础实现的构建方式,它可以更好地优化音频处理。尽管它使用C ++,但值得一提的是,尤其是如果您打算将来实现任何其他音频处理应用程序。

MediaRecorder

如前所述,有一个选项可以将MediaRecorder.AudioSource设置为UNPROCESSED。但是,如documentation中所述,并非所有设备都支持此功能。

真实原始输入

要捕获硬件通过Android应用程序实际接收到的实际输入,是一项极不可能实现的任务(至少是跨平台的)。即使您将其在一个设备上运行,如果它可以在多个设备上运行,我也会感到惊讶。在这个级别上,您可能要研究Android OS的开发,但是随后您开始将自己局限于要使用的硬件。

如您的问题评论中所述:

  

您的“错误”是每个OEM可以以不同的方式实施此操作。即使在同一家公司内,也可能有不同的团队在处理不同的模型,而它们做的事情并不完全相同。 IIRC,当我在Sony工作时,我们没有任何未使用某些预处理效果的麦克风设置。

我相信大多数OEM都是如此。