Profile dźwięku Bluetooth oparte na dźwięku Bluetooth Low Energy (BLE) umożliwiają dwukierunkowe strumieniowanie dźwięku wysokiej jakości (np. dźwięku stereo z częstotliwością próbkowania 32 kHz). Jest to możliwe dzięki stworzeniu izochronicznego kanału LE (ISO). ISO jest podobny do łącza SCO (Synchronous Connection-Oriented Link), ponieważ korzysta też z zarezerwowanej przepustowości bezprzewodowej, ale nie jest już ograniczana do 64 kb/s i można ją dynamicznie regulować.
Wejście audio Bluetooth może korzystać z najnowszego interfejsu API AudioManager w prawie wszystkich przypadkach, z wyjątkiem połączeń telefonicznych. Ten przewodnik wyjaśnia, jak nagrać dźwięk stereo z urządzeń do słuchania BLE.
Konfigurowanie aplikacji
Najpierw skonfiguruj aplikację w taki sposób, aby była kierowana na odpowiedni pakiet SDK w build.gradle
:
targetSdkVersion 31
Rejestrowanie wywołania zwrotnego audio
Utwórz AudioDeviceCallback
, który będzie informować aplikację o wszelkich zmianach w połączonych lub rozłączonych elementach AudioDevices
.
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
};
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
};
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
Znajdź urządzenie audio BLE
Uzyskaj listę wszystkich podłączonych urządzeń audio z obsługiwanymi wejściami, a następnie kliknij getType()
, aby sprawdzić, czy urządzenie to zestaw słuchawkowy, używając 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; } }
Obsługa stereo
Aby sprawdzić, czy wybrane urządzenie obsługuje mikrofony stereo, sprawdź, czy ma ono co najmniej dwa kanały. Jeśli urządzenie ma tylko 1 kanał, ustaw maskę kanału na 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; };
Konfigurowanie rejestratora dźwięku
Rejestratory dźwięku można skonfigurować za pomocą standardowego kreatora AudioRecord
.
Użyj maski kanału, aby wybrać konfigurację stereo lub 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();
Ustaw preferowane urządzenie
Ustawienie preferowanego urządzenia informuje recorder
o urządzeniu audio, na którym chcesz nagrywać.
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
Teraz możesz nagrywać dźwięk w sposób opisany w przewodniku po MediaRecorder.