오디오 녹음

저전력 블루투스 (BLE) 오디오를 기반으로 하는 블루투스 오디오 프로필을 사용하면 고품질 오디오 (예: 32kHz 샘플링 레이트의 스테레오 오디오)의 양방향 스트리밍을 사용할 수 있습니다. 이는 LE 등시 채널 (ISO)을 만들었기 때문에 가능합니다. ISO는 예약된 무선 대역폭을 사용하기도 하지만 대역폭 예약이 더 이상 64Kbps로 제한되지 않고 동적으로 조정할 수 있다는 점에서 동기 연결 지향(SCO) 링크와 유사합니다.

블루투스 오디오 입력은 전화 통화를 제외한 거의 모든 사용 사례에 최신 AudioManager API를 사용할 수 있습니다. 이 가이드에서는 BLE 오디오 히어러블에서 스테레오 오디오를 녹음하는 방법을 설명합니다.

애플리케이션 구성

먼저 build.gradle에서 올바른 SDK를 타겟팅하도록 애플리케이션을 구성합니다.

targetSdkVersion 31

오디오 콜백 등록

연결되었거나 연결 해제된 AudioDevices의 변경사항을 애플리케이션에 알리는 AudioDeviceCallback를 만듭니다.

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

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

BLE 오디오 기기 찾기

입력이 지원되는 연결된 모든 오디오 기기의 목록을 가져온 다음 getType()를 사용하여 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;
  }
}

스테레오 지원

선택한 기기에서 스테레오 마이크가 지원되는지 확인하려면 기기에 채널이 두 개 이상 있는지 확인하세요. 기기에 채널이 하나만 있으면 채널 마스크를 모노로 설정합니다.

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

오디오 녹음기 설정

오디오 녹음기는 표준 AudioRecord 빌더를 사용하여 설정할 수 있습니다. 채널 마스크를 사용하여 스테레오 또는 모노 구성을 선택합니다.

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

기본 기기 설정

기본 기기를 설정하면 녹음하려는 오디오 기기를 오디오 recorder에 알립니다.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

이제 MediaRecorder 가이드에 설명된 대로 오디오를 녹음할 수 있습니다.