บันทึกเสียง

โปรไฟล์เสียงบลูทูธอิงตามเสียงบลูทูธพลังงานต่ำ (BLE) ทำให้สามารถสตรีมเสียงคุณภาพสูงแบบ 2 ทิศทาง (เช่น เสียงสเตอริโอ ด้วยอัตราการสุ่มตัวอย่าง 32 kHz) ซึ่งเป็นไปได้ด้วยการสร้าง LE ช่องสีแบบไอโซโครน (ISO) ISO จะคล้ายกับรูปแบบการเชื่อมต่อแบบซิงโครนัส (SCO) ลิงก์เพราะใช้แบนด์วิดท์ไร้สายที่จองไว้ด้วย แต่ใช้แบนด์วิดท์ การจองจะไม่ถูกจำกัดไว้ที่ 64 Kbps อีกต่อไปและสามารถปรับเปลี่ยนแบบไดนามิกได้

อินพุตเสียงบลูทูธใช้รุ่นล่าสุดได้ AudioManager API สำหรับการใช้งานเกือบทั้งหมด เคส ไม่รวมการโทร คู่มือนี้ครอบคลุมวิธีบันทึกเสียงสเตอริโอจาก เสียง BLE ที่ได้ยิน

กำหนดค่าแอปพลิเคชันของคุณ

ก่อนอื่น ให้กำหนดค่าแอปพลิเคชันให้กำหนดเป้าหมาย SDK ที่ถูกต้องใน build.gradle ดังนี้

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

รองรับสเตอริโอ

หากต้องการตรวจสอบว่าอุปกรณ์ที่เลือกรองรับไมโครโฟนสเตอริโอหรือไม่ ให้ตรวจสอบว่า มีช่อง 2 ช่องขึ้นไป หากอุปกรณ์มีเพียงช่องเดียว ให้ตั้งค่ามาสก์ช่องทางเป็นโมโน

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 ได้แล้ว