הקלטת אודיו

פרופילי אודיו של Bluetooth על סמך Bluetooth עם צריכת אנרגיה נמוכה (BLE) Audio לאפשר סטרימינג דו-כיווני של אודיו באיכות גבוהה (לדוגמה, אודיו בסטריאו) עם תדירות דגימה של 32 kHz). זה מתאפשר בזכות היצירה של ה-LE ערוץ Isochronous (ISO). ISO דומה ל'חיבור סינכרוני' (SCO) קישור כי הוא משתמש גם ברוחב פס אלחוטי שמור, אבל רוחב הפס כבר לא מוגבלת ל- 64 Kbps ואפשר להתאים אותה באופן דינמי.

קלט אודיו של Bluetooth יכול להשתמש בגרסה האחרונה AudioManager API לשימוש כמעט מלא במקרים שונים, לא כולל שיחות טלפון. במדריך הזה מוסבר איך להקליט אודיו בסטריאו מכשירי שמיעה מסוג BLE Audio.

הגדרת האפליקציה

קודם כול צריך להגדיר את האפליקציה כך שיטרגט את ה-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 Audio

קבלת רשימה של כל התקני האודיו המחוברים שיש בהם תמיכה בקלט, ולאחר מכן להשתמש 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;
};

הגדרה של מקליט האודיו

אפשר להגדיר את מכשירי ההקלטה באמצעות ה-builder הרגיל של 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.