صدای ضبط‌شده

نمایه‌های صوتی بلوتوث براساس «صدای بلوتوث کم‌مصرف» (BLE) امکان جاری‌سازی دوطرفه صدای باکیفیت (برای مثال، صدای استریو با نرخ نمونه‌برداری ۳۲ کیلوهرتز) را فراهم می‌کند. این امر به‌لطف ایجاد «کانال هم‌زمان» (ISO) در LE امکان‌پذیر شده است. ISO شبیه به پیوند «اتصال همگام‌گرا» (SCO) است زیرا از پهنای باند بی‌سیم رزروشده نیز استفاده می‌کند، اما رزرو پهنای باند دیگر به ۶۴ کیلوبیت در ثانیه محدود نمی‌شود و می‌تواند به‌صورت پویا تنظیم شود.

ورودی صوتی بلوتوث می‌تواند از جدیدترین میانای برنامه‌سازی کاربردی AudioManager برای تقریباً همه موارد استفاده، به‌استثنای تماس‌های تلفنی، استفاده کند. این راهنما نحوه ضبط صدای استریو از سمعک‌های BLE Audio را پوشش می‌دهد.

پیکربندی برنامه

ابتدا، برنامه‌تان را پیکربندی کنید تا کیت توسعه نرم‌افزار صحیح را در 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);

یافتن دستگاه صوتی مجهز به بلوتوث کم‌مصرف

فهرستی از همه دستگاه‌های صوتی متصل‌شده با ورودی پشتیبانی‌شده دریافت کنید، سپس از getType() استفاده کنید تا ببینید آیا دستگاه هدست است یا نه، بااستفاده از AudioDeviceInfo.TYPE_BLE_HEADSET.

کاتلین

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

جاوا

AudioDeviceInfo[] allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS);
AudioDeviceInfo bleInputDevice = null;
for (AudioDeviceInfo device : allDeviceInfo) {
  if (device.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) {
    bleInputDevice = device;
    break;
  }
}

پشتیبانی از استریو

برای بررسی اینکه آیا میکروفون‌های استریو در دستگاه انتخاب‌شده پشتیبانی می‌شوند یا نه، ببینید آیا دستگاه دو یا چند کانال دارد یا نه. اگر دستگاه فقط یک کانال دارد، ماسک کانال را روی مونو تنظیم کنید.

کاتلین

var channelMask: Int = AudioFormat.CHANNEL_IN_MONO
if (audioDevice.channelCounts.size >= 2) {
  channelMask = AudioFormat.CHANNEL_IN_STEREO
}

جاوا

if (bleInputDevice.getChannelCounts() >= 2) {
  channelMask = AudioFormat.CHANNEL_IN_STEREO;
};

راه‌اندازی ضبط‌صوت

ضبط‌صوت‌ها را می‌توان بااستفاده از سازنده استاندارد AudioRecord راه‌اندازی کرد. از ماسک کانال برای انتخاب پیکربندی استریو یا مونو استفاده کنید.

کاتلین

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()

جاوا

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 اطلاع می‌دهد که می‌خواهید با کدام دستگاه صوتی ضبط کنید.

کاتلین

recorder.preferredDevice = audioDevice

جاوا

recorder.setPreferredDevice(bleInputDevice);

اکنون می‌توانید صدا را طبق آنچه در راهنمای MediaRecorder آمده است ضبط کنید.