擷取音訊時,音訊 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 架構自 Android 10 起支援同步擷取輸入內容,但設有保護使用者隱私的限制。根據這些限制,系統會忽略 AUDIO_SOURCE_FM_TUNER
等虛擬來源,並允許與一般輸入 (例如麥克風) 同時擷取。HwAudioSource
不會計入並行擷取限制。
如果應用程式是為 AUDIO_DEVICE_IN_BUS
裝置或次要AUDIO_DEVICE_IN_FM_TUNER
裝置設計,就必須明確識別這些裝置,並使用 AudioRecord.setPreferredDevice()
略過 Android 預設來源選取邏輯。