Nagrywanie dźwięku

Profile dźwięku Bluetooth oparte na technologii Bluetooth Low Energy (BLE) umożliwiają dwukierunkowe strumieniowanie dźwięku wysokiej jakości (na przykład dźwięk stereo) z częstotliwością próbkowania 32 kHz). Jest to możliwe dzięki utworzeniu grupy LE Kanał izochronologiczny (ISO). ISO jest podobny do synchronicznego połączenia zorientowanego na połączenie. ponieważ używa też zarezerwowanej przepustowości sieci bezprzewodowej. funkcja rezerwacji nie jest już ograniczona do 64 kb/s i można ją dynamicznie dostosowywać.

Wejście audio Bluetooth może korzystać z najnowszych Interfejs AudioManager API do użytku niemal we wszystkich przypadków, z wyłączeniem połączeń telefonicznych. Z tego przewodnika dowiesz się, jak nagrywać dźwięk stereo z Dźwięki BLE.

Konfigurowanie aplikacji

Najpierw skonfiguruj aplikację tak, aby była kierowana na odpowiedni pakiet SDK w interfejsie build.gradle:

targetSdkVersion 31

Rejestrowanie wywołania zwrotnego

Utwórz AudioDeviceCallback , który informuje aplikację o wszelkich zmianach dotyczących połączenia lub rozłączenia 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 BLE Audio

Zobacz listę wszystkich podłączonych urządzeń audio z obsługiwanym wejściem, a następnie użyj getType(), aby sprawdzić, To zestaw słuchawkowy, który korzysta z 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, urządzenia z co najmniej 2 kanałami. 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 dyktafonu

Dyktafon 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

Jeśli ustawisz preferowane urządzenie, recorder będzie wiedzieć, które urządzenie audio na którym chcesz nagrywać.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

Teraz możesz nagrywać dźwięk zgodnie z instrukcjami w przewodniku po narzędziu MediaRecorder.