麦克风输入

捕获音频时,Audio HAL 会收到一个 openInputStream 调用,该调用包含一个 AudioSource 参数,用于指示应如何处理麦克风输入。

VOICE_RECOGNITION 源需要一个立体声麦克风流,该麦克风流具有回声消除效果(如果可用),但未对其应用其他处理。

多声道麦克风输入

要从具有两个以上声道(立体声)的设备捕获音频,请使用声道索引掩码而不是位置索引掩码(例如 CHANNEL_IN_LEFT)。例如

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

setChannelMasksetChannelIndexMask 均设置时,AudioRecord 仅使用 setChannelMask 设置的值(最多两个声道)。

并发捕获

从 Android 10 开始,Android 框架支持输入的并发捕获,但有一些限制以保护用户隐私。作为这些限制的一部分,虚拟源(例如 AUDIO_SOURCE_FM_TUNER)会被忽略,并且允许与常规输入(例如麦克风)同时捕获。HwAudioSource 不被视为并发捕获限制的一部分。

旨在与 AUDIO_DEVICE_IN_BUS 设备或辅助 AUDIO_DEVICE_IN_FM_TUNER 设备配合使用的应用必须依赖于显式识别这些设备并使用 AudioRecord.setPreferredDevice() 来绕过 Android 默认的来源选择逻辑。