Nagrywanie dźwięku

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.