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 phát hai chiều âm thanh chất lượng cao (ví dụ: âm thanh nổi với tốc độ lấy mẫu 32 kHz). Điều này có được là nhờ việc tạo ra Kênh không đồng thời LE (ISO). ISO tương tự như Đường liên kết định hướng kết nối đồng bộ (SCO) vì đường liên kết này cũng sử dụng băng thông không dây dự trữ, nhưng hoạt động đảm bảo băng thông không còn bị giới hạn ở tốc độ 64 Kb/giây nữa và có thể được điều chỉnh linh động.

Đầu vào âm thanh Bluetooth có thể sử dụng API AudioManager mới nhất cho hầu hết các trường hợp sử dụng, ngoại trừ cuộc gọi điện thoại. Hướng dẫn này trình bày cách ghi lại âm thanh nổi từ các 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 của bạn để 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ề mọi thay đổi đối với AudioDevices đã kết nối hoặc đã ngắt kết nối.

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 đã kết nối có hỗ trợ đầu vào, sau đó sử dụng getType() để xem thiết bị có phải là tai nghe hay không bằng cách 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 thiết bị có từ hai kênh trở lên hay không. 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ẽ cho recorder biết về thiết bị âm thanh mà bạn muốn ghi âm.

Kotlin

recorder.preferredDevice = audioDevice

Java

recorder.setPreferredDevice(bleInputDevice);

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