Grabación de audio

Perfiles de audio Bluetooth basados en audio Bluetooth de bajo consumo (BLE) Permite 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 de la LE Canal isócrono (ISO). ISO es similar al modelo síncrono orientado a la conexión (SCO), ya que también usa el ancho de banda inalámbrico reservado, pero el ancho de ya no tiene un límite de 64 Kbps y puede ajustarse de forma dinámica.

la entrada de audio Bluetooth puede usar la API de AudioManager para casi todos los usos casos, excepto las llamadas telefónicas. En esta guía, se explica cómo grabar audio estéreo en Auriculares 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 informa a tu aplicación sobre cualquier cambio en la conexión o desconexión AudioDevices

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 compatibles con la entrada y, luego, úsalos getType() para ver si El dispositivo es un auricular que usa 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 comprobar si el dispositivo seleccionado admite micrófonos estéreo, comprueba si el 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;
};

Configura la grabadora de audio

Las grabadoras de audio se pueden configurar con el compilador AudioRecord estándar. 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();

Establece el dispositivo preferido

Cuando configuras un dispositivo preferido, se le informa al audio recorder qué dispositivo de audio que quieras usar para la grabación.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

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