Cấu hình âm thanh Bluetooth dựa trên Âm thanh Bluetooth năng lượng thấp (BLE) cho phép truyền phát hai chiều âm thanh chất lượng cao (ví dụ: âm thanh nổi với tốc độ lấy mẫu 32 kHz). Điều này có được là nhờ việc tạo ra Kênh không đồng thời LE (ISO). ISO tương tự như Đường liên kết định hướng kết nối đồng bộ (SCO) vì đường liên kết này cũng sử dụng băng thông không dây dự trữ, nhưng hoạt động đảm bảo băng thông không còn bị giới hạn ở tốc độ 64 Kb/giây nữa và có thể được điều chỉnh linh động.
Đầu vào âm thanh Bluetooth có thể sử dụng API AudioManager mới nhất cho hầu hết các trường hợp sử dụng, ngoại trừ cuộc gọi điện thoại. Hướng dẫn này trình bày cách ghi lại âm thanh nổi từ các thiết bị nghe được Âm thanh BLE.
Định cấu hình ứng dụng
Trước tiên, hãy định cấu hình ứng dụng của bạn để nhắm đến đúng SDK trong build.gradle
:
targetSdkVersion 31
Đăng ký lệnh gọi lại âm thanh
Tạo một AudioDeviceCallback
để cho ứng dụng của bạn biết về mọi thay đổi đối với AudioDevices
đã kết nối hoặc đã ngắt kết nối.
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
};
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
};
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
Tìm thiết bị âm thanh BLE
Lấy danh sách tất cả thiết bị âm thanh đã kết nối có hỗ trợ đầu vào, sau đó sử dụng getType()
để xem thiết bị có phải là tai nghe hay không bằng cách sử dụng 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; } }
Hỗ trợ âm thanh nổi
Để kiểm tra xem micrô âm thanh nổi có được hỗ trợ trên thiết bị đã chọn hay không, hãy xem thiết bị có từ hai kênh trở lên hay không. Nếu thiết bị chỉ có một kênh, hãy đặt mặt nạ kênh thành đơn âm.
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; };
Thiết lập trình ghi âm
Bạn có thể thiết lập trình ghi âm bằng trình tạo AudioRecord
tiêu chuẩn.
Sử dụng mặt nạ kênh để chọn cấu hình âm thanh nổi hoặc đơn âm.
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();
Đặt thiết bị ưu tiên
Việc đặt thiết bị ưu tiên sẽ cho recorder
biết về thiết bị âm thanh mà bạn muốn ghi âm.
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
Giờ đây, bạn có thể ghi âm như đã nêu trong hướng dẫn về MediaRecorder.