基于蓝牙低功耗 (BLE) 音频的蓝牙音频配置文件允许双向流式传输高质量的音频(例如,采样率为 32 kHz 的立体声音频)。这要归功于 LE 等时通道 (ISO) 的创建。ISO 与
蓝牙音频输入可以在几乎所有用例(通话除外)中使用最新的 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 指南中的说明录制音频。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-11。