Аудиопрофили Bluetooth на основе Bluetooth Low Energy (BLE) Audio обеспечивают двунаправленную потоковую передачу высококачественного звука (например, стереозвука с частотой дискретизации 32 кГц). Это возможно благодаря созданию изохронного канала LE (ISO). ISO аналогичен каналу с синхронным соединением (SCO), поскольку он также использует зарезервированную полосу пропускания беспроводной сети, но резервирование полосы пропускания больше не ограничивается 64 Кбит/с и может динамически регулироваться.
Аудиовход Bluetooth может использовать новейший API AudioManager практически для всех случаев использования, за исключением телефонных звонков. В этом руководстве рассказывается, как записывать стереозвук с наушников BLE Audio.
Настройте свое приложение
Сначала настройте свое приложение для использования правильного SDK в build.gradle
:
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
.
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
}
}
AudioDeviceInfo[] allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS);
AudioDeviceInfo bleInputDevice = null;
for (AudioDeviceInfo device : allDeviceInfo) {
if (device.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) {
bleInputDevice = device;
break;
}
}
Поддержка стерео
Чтобы проверить, поддерживаются ли стереомикрофоны на выбранном устройстве, проверьте, имеет ли устройство два или более каналов. Если устройство имеет только один канал, установите маску канала на моно.
var channelMask: Int = AudioFormat.CHANNEL_IN_MONO
if (audioDevice.channelCounts.size >= 2) {
channelMask = AudioFormat.CHANNEL_IN_STEREO
}
if (bleInputDevice.getChannelCounts() >= 2) {
channelMask = AudioFormat.CHANNEL_IN_STEREO;
};
Настройте диктофон
Аудиорекордеры можно настроить с помощью стандартного конструктора AudioRecord
. Используйте маску канала для выбора конфигурации стерео или моно.
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()
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
, какое аудиоустройство вы хотите записать.
Теперь вы можете записывать звук, как описано в руководстве MediaRecorder .