Ghi âm

Cấu hình âm thanh Bluetooth dựa trên Âm thanh Bluetooth năng lượng thấp (BLE) cho phép truyền trực tuyến âm thanh chất lượng cao hai chiều (ví dụ: âm thanh nổi với tốc độ lấy mẫu 32 kHz). Điều này có thể đạt được là nhờ việc tạo ra LE Kênh đồng thời (ISO). ISO tương tự như định hướng kết nối đồng bộ (SCO) Liên kết vì mạng này cũng sử dụng băng thông không dây dành riêng, nhưng băng thông quảng cáo đặt trước không còn bị giới hạn ở 64 Kb/giây và có thể điều chỉnh linh hoạt.

Thiết bị đầu vào âm thanh Bluetooth có thể sử dụng phiên bản API AudioManager cho hầu hết các mục đích sử dụng ngoại trừ các cuộc gọi điện thoại. Hướng dẫn này trình bày cách ghi âm thanh nổi từ Thiết bị nghe được Âm thanh BLE.

Định cấu hình ứng dụng

Trước tiên, hãy định cấu hình ứng dụng để nhắm đến đúng SDK trong build.gradle:

targetSdkVersion 31

Đăng ký lệnh gọi lại âm thanh

Tạo một AudioDeviceCallback cho ứng dụng của bạn biết về bất kỳ thay đổi nào đối với chế độ đã kết nối hoặc đã ngắt kết nối AudioDevices.

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

audioManager.registerAudioDeviceCallback(audioDeviceCallback);

Tìm thiết bị âm thanh BLE

Lấy danh sách tất cả thiết bị âm thanh được kết nối có hỗ trợ đầu vào rồi sử dụng getType() để xem thiết bị là tai nghe sử dụng 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;
  }
}

Hỗ trợ âm thanh nổi

Để kiểm tra xem micrô âm thanh nổi có được hỗ trợ trên thiết bị đã chọn hay không, hãy xem có hai kênh trở lên. Nếu thiết bị chỉ có một kênh, hãy đặt mặt nạ kênh thành đơn âm.

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

Thiết lập trình ghi âm

Bạn có thể thiết lập trình ghi âm bằng trình tạo AudioRecord tiêu chuẩn. Sử dụng mặt nạ kênh để chọn cấu hình âm thanh nổi hoặc đơn âm.

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

Đặt thiết bị ưu tiên

Việc đặt thiết bị ưu tiên sẽ thông báo cho recorder âm thanh biết thiết bị âm thanh nào mà bạn muốn ghi cùng.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

Giờ đây, bạn có thể ghi âm như nêu trong hướng dẫn MediaRecorder.