Запись аудио

Аудиопрофили Bluetooth на основе Bluetooth с низким энергопотреблением (BLE) Audio позволяют осуществлять двунаправленную потоковую передачу высококачественного звука (например, стереозвука с частотой дискретизации 32 кГц). Это стало возможным благодаря созданию изохронного канала LE (ISO). ISO похож на синхронный канал с установлением соединения (SCO), поскольку в нем также используется зарезервированная пропускная способность беспроводной связи. Однако ее резервирование больше не ограничено 64 Кбит/с и может динамически корректироваться.

Для ввода аудио через Bluetooth можно использовать последнюю версию AudioManager API почти во всех случаях, кроме телефонных звонков. В этом руководстве рассказывается, как записывать стереоаудио с помощью наушников BLE Audio.

Настройка приложения

Сначала настройте приложение для работы с нужным SDK в файле build.gradle:

targetSdkVersion 31

Регистрация обратного вызова Audio

Создайте 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.