録音

Bluetooth Low Energy(BLE)オーディオに基づく Bluetooth オーディオ プロファイルにより、高音質オーディオ(サンプリング レート 32 kHz のステレオ オーディオなど)の双方向ストリーミングが可能になります。これは、LE アイソクロナス チャネル(ISO)を作成することで可能です。ISO は、予約済みのワイヤレス帯域幅も使用するため、同期接続指向(SCO)リンクに似ていますが、帯域幅予約が 64 Kbps に制限されなくなり、動的に調整できます。

Bluetooth オーディオ入力では、通話を除くほぼすべてのユースケースで、最新の 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;
  }
}

ステレオのサポート

選択したデバイスでステレオ マイクがサポートされているかどうかを確認するには、デバイスに 2 つ以上のチャンネルがあるかどうかを確認します。デバイスのチャンネルが 1 つのみの場合は、チャンネル マスクをモノラルに設定します。

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 のガイドに記載されているように、音声を録音できるようになりました。