麥克風輸入

擷取音訊時,音訊 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);

如果同時設定 setChannelMasksetChannelIndexMaskAudioRecord 只會使用 setChannelMask 設定的值 (最多兩個管道)。

同時擷取

Android 架構自 Android 10 起支援同步擷取輸入內容,但設有保護使用者隱私的限制。根據這些限制,系統會忽略 AUDIO_SOURCE_FM_TUNER 等虛擬來源,並允許與一般輸入 (例如麥克風) 同時擷取。HwAudioSource 不會計入並行擷取限制。

如果應用程式是為 AUDIO_DEVICE_IN_BUS 裝置或次要AUDIO_DEVICE_IN_FM_TUNER裝置設計,就必須明確識別這些裝置,並使用 AudioRecord.setPreferredDevice() 略過 Android 預設來源選取邏輯。