ملفات الصوت عبر البلوتوث استنادًا إلى تقنية البلوتوث المنخفض الطاقة (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.