音频录制

基于蓝牙低功耗 (BLE) 音频的蓝牙音频配置文件允许双向流式传输高质量音频(例如,具有 32 kHz 采样率的立体声音频)。这得益于 LE 等时通道 (ISO) 的创建。ISO 类似于同步面向连接 (SCO) 链路,因为它也使用预留的无线带宽,但带宽预留不再限制在 64 Kbps,并且可以动态调整。

蓝牙音频输入可以使用最新的 AudioManager API 用于几乎所有用例,电话呼叫除外。本指南介绍如何从 BLE 音频可穿戴设备录制立体声音频。

配置您的应用程序

首先,配置您的应用程序以在 build.gradle 中定位正确的 SDK

targetSdkVersion 31

注册音频回调

创建 AudioDeviceCallback,使您的应用程序了解连接或断开连接的 AudioDevices 的任何更改。

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 指南 中的说明录制音频。