以藍牙低功耗 (BLE) 音訊為基礎的藍牙音訊設定檔,可對高品質音訊進行雙向串流,例如採 32 kHz 取樣率的立體音訊。這要歸功於 LE Iochronous 頻道 (ISO) 建立的。ISO 與同步方向導向 (SCO) 連結類似,因為這個標記也會使用保留的無線頻寬,但頻寬保留已不再限制為 64 Kbps,並且可動態調整。
藍牙音訊輸入可以使用最新的 AudioManager API (不含通話)。本指南說明如何錄製 BLE Audio 助聽器的立體聲音訊。
設定應用程式
首先,請設定應用程式,在 build.gradle
中指定正確的 SDK:
targetSdkVersion 31
註冊音訊回呼
建立 AudioDeviceCallback
,讓應用程式知道已連結或中斷連線的 AudioDevices
是否有任何變更。
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
};
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
};
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
尋找 BLE 音訊裝置
取得支援輸入的所有已連線音訊裝置清單,然後使用 getType()
透過 AudioDeviceInfo.TYPE_BLE_HEADSET
確認裝置是否為耳機。
Kotlin
val allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS) var bleInputDevice: AudioDeviceInfo? = null for (device in allDeviceInfo) { if (device.type == AudioDeviceInfo.TYPE_BLE_HEADSET) { bleInputDevice = device break } }
Java
AudioDeviceInfo[] allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS); AudioDeviceInfo bleInputDevice = null; for (AudioDeviceInfo device : allDeviceInfo) { if (device.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) { bleInputDevice = device; break; } }
立體聲支援
如要確認所選裝置是否支援立體聲麥克風,請查看裝置是否有兩個以上的聲道。如果裝置只有一個頻道,請將頻道遮罩設為單聲道。
Kotlin
var channelMask: Int = AudioFormat.CHANNEL_IN_MONO if (audioDevice.channelCounts.size >= 2) { channelMask = AudioFormat.CHANNEL_IN_STEREO }
Java
if (bleInputDevice.getChannelCounts() >= 2) { channelMask = AudioFormat.CHANNEL_IN_STEREO; };
設定錄音工具
您可以使用標準 AudioRecord
建構工具設定錄音工具。使用聲道遮罩選取立體聲或單聲道設定。
Kotlin
val recorder = AudioRecord.Builder() .setAudioSource(MediaRecorder.AudioSource.MIC) .setAudioFormat(AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(32000) .setChannelMask(channelMask) .build()) .setBufferSizeInBytes(2 * minBuffSizeBytes) .build()
Java
AudioRecord recorder = new AudioRecord.Builder() .setAudioSource(MediaRecorder.AudioSource.MIC) .setAudioFormat(new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(32000) .setChannelMask(channelMask) .build()) .setBufferSizeInBytes(2*minBuffSizeBytes) .build();
設定偏好裝置
設定偏好裝置會告知音訊 recorder
,要使用哪一個音訊裝置錄製。
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
您現在可以依照 MediaRecorder 指南中的指示錄製音訊。