捕捉安卓上的原始麦克风输入

0 人关注

我在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 个评论
你的 "错误 "是,每个OEM可以以不同的方式实施。即使在同一家公司,也可能有不同的团队在不同的型号上工作,他们做的事情不完全一样。我记得,当我在索尼工作时,我们没有任何麦克风设置不使用 一些 预处理效果。我相信谷歌的兼容性定义文件实际上指出,不应对 VOICE_RECOGNITION 音频源进行预处理,但这并没有以任何方式强制执行(至少在当时没有 - 我不知道这是否已经改变)。
好的,这就是我的想法。然而,有什么办法可以回到原始数据,即使有一些预处理? 例如,禁用效果?
android
audio
microphone
voice-recognition
audiorecord
Emanuele Spiriti
Emanuele Spiriti
发布于 2014-08-18
3 个回答
WoodyDev
WoodyDev
发布于 2022-01-29
已采纳
0 人赞同

OpenSL ES

为了获得最接近未经处理的音频,我认为Android NDK中的 OpenSL ES API规范是最佳选择。谷歌提供了一个实时录音和回放的 例子项目 (有一个延迟以避免反馈)。

这就是AudioRecorder的底层实现的构建方式,它可以更好地优化你的音频处理。虽然它使用了C++,但可能值得了解,特别是如果你打算在未来实现任何其他音频处理应用程序。

媒体记录器

如前所述,有一个选项可以将 MediaRecorder.AudioSource 设置为 UNPROCESSED 。然而,正如 文档 中提到的,这并不支持所有的设备。

真正的原始输入

要通过一个安卓应用程序捕捉硬件实际收到的真实输入,是一个非常不可能实现的任务(至少是跨平台)。即使你让它在一个设备上工作,如果它在几个设备上工作,我也会感到惊讶。在这个层面上,你会想看看安卓操作系统的开发,但这样你就会开始把自己限制在你想使用的硬件上。

正如你的问题的评论中提到的:

你的 "错误 "是,每个OEM可以以不同的方式实施。即使在同一家公司,也可能有不同的团队在不同的型号上工作,做的事情也不完全一样。我记得,当我在索尼工作时,我们没有任何麦克风设置不使用一些预处理效果。

我确信这在大多数OEM中是真实的。