捕获音频时,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);
当 setChannelMask
和 setChannelIndexMask
均设置时,AudioRecord
仅使用 setChannelMask
设置的值(最多两个声道)。
并发捕获
从 Android 10 开始,Android 框架支持输入的并发捕获,但有一些限制以保护用户隐私。作为这些限制的一部分,虚拟源(例如 AUDIO_SOURCE_FM_TUNER
)会被忽略,并且允许与常规输入(例如麦克风)同时捕获。HwAudioSource
不被视为并发捕获限制的一部分。
旨在与 AUDIO_DEVICE_IN_BUS
设备或辅助 AUDIO_DEVICE_IN_FM_TUNER
设备配合使用的应用必须依赖于显式识别这些设备并使用 AudioRecord.setPreferredDevice()
来绕过 Android 默认的来源选择逻辑。