Enregistrement audio

Profils audio Bluetooth basés sur l'audio Bluetooth à basse consommation (BLE) permettent un streaming bidirectionnel d'un son de haute qualité (par exemple, un son stéréo avec un taux d'échantillonnage de 32 kHz). C'est possible grâce à la création de la balise LE Canal isochronique (ISO). L'ISO est similaire à la norme de sécurité (SCO) Link, car il utilise aussi de la bande passante sans fil réservée, mais la bande passante n'est plus plafonnée à 64 Kbit/s et peut être ajustée de façon dynamique.

L'entrée audio Bluetooth peut utiliser les dernières API AudioManager pour presque toutes les utilisations à l'exception des appels téléphoniques. Ce guide explique comment enregistrer du contenu audio stéréo à partir de Écouteurs audio BLE.

Configurer votre application

Commencez par configurer votre application pour cibler le SDK approprié dans build.gradle:

targetSdkVersion 31

Enregistrer un rappel audio

Créez un AudioDeviceCallback indiquant à votre application tout changement lié aux connexions et aux déconnexions AudioDevices

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

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

Localiser un appareil audio BLE

Obtenez la liste de tous les appareils audio connectés avec une entrée compatible, puis utilisez getType() pour voir si l'appareil est un casque utilisant 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;
  }
}

Compatibilité stéréo

Pour vérifier si l'appareil sélectionné est compatible avec les micros stéréo, vérifiez si les l'appareil dispose de deux canaux ou plus. Si l'appareil ne dispose que d'un seul canal, définissez le masque de canal sur 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;
};

Configurer l'enregistreur audio

Les enregistreurs audio peuvent être configurés à l'aide de l'outil de création AudioRecord standard. Utilisez le masque de canal pour sélectionner une configuration stéréo ou 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();

Définir l'appareil par défaut

La définition d'un appareil par défaut permet d'indiquer à l'recorder audio quel appareil audio avec lequel vous souhaitez enregistrer.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

Vous pouvez désormais enregistrer du contenu audio comme indiqué dans le guide MediaRecorder.