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

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

يمكن أن يستخدم إدخال الصوت عبر البلوتوث أحدث إصدار واجهة برمجة تطبيقات 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 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;
};

إعداد مسجِّل الصوت

يمكن إعداد مسجِّلات الصوت باستخدام أداة إنشاء 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.