基于低功耗蓝牙 (BLE) 音频的蓝牙音频配置文件允许双向流式传输高质量音频(例如,采样率为 32 kHz 的立体声音频)。这得益于 LE Isochronous Channel (ISO) 的创建。ISO 类似于 Synchronous Connection-Oriented (SCO) Link,因为它也使用保留的无线带宽,但带宽保留不再限制在 64 Kbps,并且可以动态调整。
蓝牙音频输入可以使用最新的 AudioManager API 来满足几乎所有用例,电话通话除外。本指南介绍了如何从 BLE 音频听戴设备录制立体声音频。
配置您的应用
首先,在 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 指南中所述录制音频。