音频录制

基于低功耗蓝牙 (BLE) 音频的蓝牙音频配置文件允许双向流式传输高质量音频(例如,采样率为 32 kHz 的立体声音频)。这得益于 LE Isochronous Channel (ISO) 的创建。ISO 类似于 Synchronous Connection-Oriented (SCO) Link,因为它也使用保留的无线带宽,但带宽保留不再限制在 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 指南中所述录制音频。