Grabación de audio

Los perfiles de audio Bluetooth basados en el audio Bluetooth de bajo consumo (BLE) permiten la transmisión bidireccional de audio de alta calidad (por ejemplo, audio estéreo con una tasa de muestreo de 32 kHz). Esto es posible gracias a la creación del canal isocrónico de LE (ISO). ISO es similar al vínculo síncrono orientado a la conexión (SCO) porque también usa el ancho de banda inalámbrico reservado, pero la reserva del ancho de banda ya no está limitada a 64 Kbps y se puede ajustar de forma dinámica.

La entrada de audio Bluetooth puede usar la API de AudioManager más reciente para casi todos los casos de uso, excepto las llamadas telefónicas. En esta guía, se explica cómo grabar audio estéreo desde dispositivos de audio BLE.

Configura tu aplicación

Primero, configura tu aplicación para que se oriente al SDK correcto en build.gradle:

targetSdkVersion 31

Registrar devolución de llamada de audio

Crea un AudioDeviceCallback que informe a tu aplicación sobre cualquier cambio en AudioDevices conectado o desconectado.

final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
  @Override
  public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
    };
  @Override
  public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
    // Handle device removal
  };
};

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

Cómo buscar un dispositivo de audio BLE

Obtén una lista de todos los dispositivos de audio conectados con entradas compatibles y, luego, usa getType() para ver si el dispositivo es auriculares con 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;
  }
}

Compatibilidad con estéreo

Para verificar si el dispositivo seleccionado admite micrófonos estéreo, verifica si el dispositivo tiene dos o más canales. Si el dispositivo solo tiene un canal, establece la máscara de canal en mono.

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;
};

Cómo configurar la grabadora de audio

Las grabadoras de audio se pueden configurar con el compilador estándar de AudioRecord. Usa la máscara de canal para seleccionar la configuración estéreo o mono.

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();

Establecer dispositivo preferido

La configuración de un dispositivo preferido le indica al recorder de audio con qué dispositivo deseas grabar.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

Ahora, puedes grabar audio como se describe en la guía de MediaRecorder.