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