我在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,但它没有任何改变。
OpenSL ES
为了获得最接近未经处理的音频,我认为Android NDK中的 OpenSL ES API规范是最佳选择。谷歌提供了一个实时录音和回放的 例子项目 (有一个延迟以避免反馈)。
这就是AudioRecorder的底层实现的构建方式,它可以更好地优化你的音频处理。虽然它使用了C++,但可能值得了解,特别是如果你打算在未来实现任何其他音频处理应用程序。
媒体记录器
如前所述,有一个选项可以将
设置为
。然而,正如 文档 中提到的,这并不支持所有的设备。
MediaRecorder.AudioSource
UNPROCESSED
真正的原始输入
要通过一个安卓应用程序捕捉硬件实际收到的真实输入,是一个非常不可能实现的任务(至少是跨平台)。即使你让它在一个设备上工作,如果它在几个设备上工作,我也会感到惊讶。在这个层面上,你会想看看安卓操作系统的开发,但这样你就会开始把自己限制在你想使用的硬件上。
正如你的问题的评论中提到的:
你的 "错误 "是,每个OEM可以以不同的方式实施。即使在同一家公司,也可能有不同的团队在不同的型号上工作,做的事情也不完全一样。我记得,当我在索尼工作时,我们没有任何麦克风设置不使用一些预处理效果。
我确信这在大多数OEM中是真实的。