Аудиопрофили 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
, какое аудиоустройство вы хотите записать.
Котлин
recorder.preferredDevice = audioDevice
Ява
recorder.setPreferredDevice(bleInputDevice);
Теперь вы можете записывать звук, как описано в руководстве MediaRecorder .