التسجيل الصوتي

تسمح الملفات الشخصية للصوت بالبلوتوث المستندة إلى "صوت Bluetooth Low Energy (BLE)" ببث الصوت العالي الجودة ثنائي الاتجاه (على سبيل المثال، صوت الاستيريو مع معدّل عيّنة يبلغ 32 كيلوهرتز). واستطعنا فعل ذلك بفضل إنشاء قناة LE Isochronous Channel. ويشبه ISO الرابط المتزامن الموجه للاتصال (SCO) لأنه يستخدم أيضًا معدل نقل بيانات لاسلكيًا محجوزًا، ولكن لم يعد حجز معدل نقل البيانات مقيدًا بـ 64 كيلوبت في الثانية ويمكن تعديله ديناميكيًا.

يمكن لميزة "إدخال الصوت عبر البلوتوث" استخدام أحدث واجهة برمجة تطبيقات AudioManager لجميع حالات الاستخدام تقريبًا، باستثناء المكالمات الهاتفية. يتناول هذا الدليل كيفية تسجيل صوت استيريو من أجهزة 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

يمكنك الحصول على قائمة بجميع الأجهزة السماعية المتصلة مع إمكانية إدخال البيانات، ثم استخدام الرمز 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.