Enregistrement audio

Les profils audio Bluetooth basés sur l'audio Bluetooth à basse consommation (BLE) permettent un streaming bidirectionnel de contenus audio de haute qualité (par exemple, audio stéréo avec un taux d'échantillonnage de 32 kHz). Cela est possible grâce à la création de LE Isochronous Channel (ISO). L'ISO est semblable au lien SCO (Synchronous Connection-Oriented), car il utilise également la bande passante sans fil réservée, mais la réservation de bande passante n'est plus limitée à 64 kbit/s et peut être ajustée dynamiquement.

L'entrée audio Bluetooth peut utiliser la dernière API AudioManager pour presque tous les cas d'utilisation, à l'exception des appels téléphoniques. Ce guide explique comment enregistrer un son stéréo à partir d'é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 une AudioDeviceCallback qui informe votre application de toute modification apportée aux AudioDevices connectés ou déconnectés.

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 disposant d'une entrée compatible, puis utilisez getType() pour vérifier si l'appareil est un casque à l'aide de 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 les micros stéréo sont compatibles avec l'appareil sélectionné, vérifiez si celui-ci dispose de deux canaux ou plus. Si l'appareil ne possède qu'un seul canal, définissez le masque de canaux 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

Le fait de définir un appareil par défaut permet d'indiquer à la recorder audio l'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 de MediaRecorder.