在捕获音频时,音频 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);
如果 setChannelMask
和 setChannelIndexMask
均已设置,则 AudioRecord
仅使用由 setChannelMask
设置的值(最多两个声道)。
并发捕获
从 Android 10 开始,Android 框架支持并发捕获输入,但具有保护用户隐私的限制。作为这些限制的一部分,AUDIO_SOURCE_FM_TUNER
等虚拟来源会被忽略,因此可以与常规输入(例如麦克风)同时捕获。HwAudioSource
不属于并发捕获限制的一部分。
如果应用设计用于与 AUDIO_DEVICE_IN_BUS
设备或辅助 AUDIO_DEVICE_IN_FM_TUNER
设备一起使用,则必须能够明确识别这些设备,并使用 AudioRecord.setPreferredDevice()
绕过 Android 默认声源选择逻辑。