Аудиозапись

Аудиопрофили 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 .