我在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但它没有改变任何东西。
答案 0 :(得分:0)
您现在可以使用MediaRecorder.AudioSource.UNPROCESSED
。这应始终提供来自麦克风的未处理信号。请注意,正如WoodyDev指出的那样,并非所有设备都支持此功能。
有关更多信息,请参见the Android docs。
答案 1 :(得分:0)
为了尽可能接近未处理的音频,我认为Android NDK中的OpenSL ES API规范是最佳选择。 Google提供example project的实时记录和回放(为避免反馈会有所延迟)。
这是AudioRecorder的基础实现的构建方式,它可以更好地优化音频处理。尽管它使用C ++,但值得一提的是,尤其是如果您打算将来实现任何其他音频处理应用程序。
如前所述,有一个选项可以将MediaRecorder.AudioSource
设置为UNPROCESSED
。但是,如documentation中所述,并非所有设备都支持此功能。
要捕获硬件通过Android应用程序实际接收到的实际输入,是一项极不可能实现的任务(至少是跨平台的)。即使您将其在一个设备上运行,如果它可以在多个设备上运行,我也会感到惊讶。在这个级别上,您可能要研究Android OS的开发,但是随后您开始将自己局限于要使用的硬件。
如您的问题评论中所述:
您的“错误”是每个OEM可以以不同的方式实施此操作。即使在同一家公司内,也可能有不同的团队在处理不同的模型,而它们做的事情并不完全相同。 IIRC,当我在Sony工作时,我们没有任何未使用某些预处理效果的麦克风设置。
我相信大多数OEM都是如此。