麦克风输入

在捕获音频时,音频 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 默认声源选择逻辑。