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.