ضبط صدا

نمایه‌های صوتی بلوتوث مبتنی بر صدای کم انرژی بلوتوث (BLE) امکان پخش دو طرفه صدای با کیفیت بالا را فراهم می‌کنند (به عنوان مثال، صدای استریو با نرخ نمونه‌برداری 32 کیلوهرتز). این به لطف ایجاد کانال LE Isochronous (ISO) امکان پذیر است. ISO شبیه پیوند اتصال گرا (SCO) همزمان است زیرا از پهنای باند بی سیم رزرو شده نیز استفاده می کند، اما رزرو پهنای باند دیگر روی 64 کیلوبیت بر ثانیه محدود نمی شود و می تواند به صورت پویا تنظیم شود.

ورودی صوتی بلوتوث می‌تواند از آخرین API 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 هدست است یا خیر.

کاتلین

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 ذکر شده است ضبط کنید.