擷取音訊時,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 預設來源選取邏輯。