Audioaufnahme

Bluetooth-Audioprofile, die auf Bluetooth Low Energy (BLE) Audio basieren, ermöglichen bidirektionales Streaming von Audiodaten mit hoher Qualität (z. B. Stereoaudio mit einer Abtastrate von 32 kHz). Dies ist durch die Erstellung des LE Isochronous Channel (ISO) möglich. ISO ähnelt dem SCO-Link (Synchronous Connection-Oriented Link), da auch reservierte WLAN-Bandbreite verwendet wird. Die Bandbreitenreservierung ist jedoch nicht mehr auf 64 Kbit/s begrenzt und kann dynamisch angepasst werden.

Die Bluetooth-Audioeingabe kann die neueste AudioManager API für fast alle Anwendungsfälle verwenden, mit Ausnahme von Telefonanrufen. In dieser Anleitung wird beschrieben, wie Sie Stereoaudio von BLE Audio-Hearables aufzeichnen.

Anwendung konfigurieren

Konfigurieren Sie zuerst Ihre Anwendung so, dass sie auf das richtige SDK in build.gradle ausgerichtet ist:

targetSdkVersion 31

Sprachrückruf registrieren

Erstellen Sie eine AudioDeviceCallback, die Ihre Anwendung über Änderungen an verbundenen oder nicht verbundenen AudioDevices informiert.

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

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

BLE-Audiogerät suchen

Rufen Sie eine Liste aller verbundenen Audiogeräte mit unterstützter Eingabe ab und verwenden Sie dann getType(), um mit AudioDeviceInfo.TYPE_BLE_HEADSET zu prüfen, ob das Gerät ein Headset ist.

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

Stereo-Unterstützung

Wenn Sie wissen möchten, ob Stereomikrofone auf dem ausgewählten Gerät unterstützt werden, prüfen Sie, ob das Gerät zwei oder mehr Kanäle hat. Verfügt das Gerät nur über einen Kanal, setzen Sie die Kanalmaske auf „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;
};

Audiorekorder einrichten

Audiorekorder können mit dem standardmäßigen AudioRecord-Builder eingerichtet werden. Über die Kanalmaske können Sie die Stereo- oder Mono-Konfiguration auswählen.

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

Bevorzugtes Gerät festlegen

Wenn du ein bevorzugtes Gerät festlegst, wird der Audio-recorder mitgeteilt, mit welchem Audiogerät du aufnehmen möchtest.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

Jetzt kannst du Audioinhalte wie im MediaRecorder-Leitfaden beschrieben aufnehmen.