Tema ini menjelaskan operasi dan konfigurasi audio umum dalam SDK Alibaba Real-Time Communication (ARTC).
Pengenalan fitur
SDK ARTC menyediakan berbagai fitur untuk konfigurasi dan operasi audio. Fitur-fitur ini mencakup aspek-aspek utama seperti pengaturan pengkodean audio dan mode skenario, mengelola penangkapan serta pemutaran audio lokal, serta mengontrol pemutaran audio jarak jauh. SDK ini juga mendukung pemantauan in-ear dan pengalihan audio yang fleksibel.
Kode contoh
Operasi dan konfigurasi audio umum untuk Android: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/AudioBasicUsage/AudioBasicUsageActivity.java.
Operasi dan konfigurasi audio umum untuk iOS: iOS/ARTCExample/BasicUsage/AudioBasicUsage/AudioBasicUsageVC.swift.
Prasyarat
Anda memiliki Akun Alibaba Cloud yang valid dan telah membuat aplikasi ApsaraVideo Real-time Communication. Untuk informasi lebih lanjut, lihat Buat aplikasi. Anda dapat memperoleh App ID dan App Key di Konsol Manajemen Aplikasi.
Anda telah mengintegrasikan SDK ARTC ke dalam proyek Anda dan menerapkan panggilan audio dan video real-time dasar. Untuk informasi lebih lanjut tentang integrasi SDK, lihat Unduh dan integrasikan SDK. Untuk menerapkan panggilan audio dan video, lihat Implementasikan panggilan audio dan video.
Implementasi
1. Atur pengkodean audio dan mode skenario (sebelum bergabung dengan saluran)
Gunakan metode setAudioProfile untuk mengatur berbagai mode pengkodean audio dan mode skenario audio. Ini memungkinkan Anda mengoptimalkan kualitas audio sesuai kebutuhan bisnis dan pengguna.
Metode
setAudioProfilehanya dapat dipanggil sebelum bergabung dengan saluran. Pengaturan ini tidak dapat diubah setelah bergabung dengan saluran.Disarankan menggunakan mode berkualitas tinggi (
AliRtcEngineHighQualityMode) dan mode skenario musik (AliRtcSceneMusicMode).
1.1. Mode pengkodean audio (AliRtcAudioProfile)
Disarankan menggunakan mode berkualitas tinggi (
AliRtcEngineHighQualityMode).Untuk interoperabilitas dengan klien web, pilih mode dengan laju sampel 48 kHz.
Untuk audio dua saluran, atur mode ke
AliRtcEngineStereoHighQualityMode.
Enumerasi | Deskripsi | Laju sampel | Jumlah saluran | Bitrate pengkodean maksimum |
AliRtcEngineLowQualityMode | Mode audio berkualitas rendah | 8000 Hz | Mono | 12 kbps |
AliRtcEngineBasicQualityMode | Mode audio berkualitas standar | 16000 Hz | Mono | 24 kbps |
AliRtcEngineHighQualityMode | Mode audio berkualitas tinggi | 48000 Hz | Mono | 64 kbps |
AliRtcEngineStereoHighQualityMode | Mode audio berkualitas tinggi stereo | 48000 Hz | Stereo | 80 kbps |
AliRtcEngineSuperHighQualityMode | Mode audio berkualitas super tinggi | 48000 Hz | Mono | 96 kbps |
AliRtcEngineStereoSuperHighQualityMode | Mode audio berkualitas super tinggi stereo | 48000 Hz | Stereo | 128 kbps |
1.2. Mode skenario audio (AliRtcAudioScenario)
Enumerasi | Deskripsi |
AliRtcSceneDefaultMode | Menggunakan perangkat keras 3A dan memungkinkan penangkapan audio dari perangkat Bluetooth. Setel mode ini untuk penangkapan audio Bluetooth. |
AliRtcSceneMusicMode | (Direkomendasikan) Mode skenario musik. Menggunakan perangkat lunak 3A untuk menangkap audio dari ponsel untuk kualitas audio yang lebih baik. |
1.3. Kode contoh
Kode berikut menunjukkan cara mengatur pengkodean audio dan mode skenario untuk skenario umum.
Bluetooth Audio Capture
Android
// Atur skenario ke AliRtcSceneDefaultMode.
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneDefaultMode);iOS
// Atur skenario ke AliRtcSceneDefaultMode.
engine.setAudioProfile(AliRtcAudioProfile.engineHighQualityMode, audio_scene: AliRtcAudioScenario.sceneDefaultMode)Interoperabilitas dengan Klien Web
Android
// Atur mode pengkodean ke salah satu dengan laju sampel 48 kHz, seperti AliRtcEngineHighQualityMode.
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);iOS
// Atur mode pengkodean ke salah satu dengan laju sampel 48 kHz, seperti AliRtcEngineHighQualityMode.
engine.setAudioProfile(AliRtcAudioProfile.engineHighQualityMode, audio_scene: AliRtcAudioScenario.sceneMusicMode)Audio Dua Saluran
Android
// Atur mode ke salah satu yang mencakup Stereo, seperti AliRtcEngineStereoHighQualityMode.
mAliRtcEngine.setAudioProfile(AliRtcEngineStereoHighQualityMode, AliRtcSceneMusicMode);iOS
// Atur mode ke salah satu yang mencakup Stereo, seperti AliRtcEngineStereoHighQualityMode.
engine.setAudioProfile(AliRtcAudioProfile.engineStereoHighQualityMode, audio_scene: AliRtcAudioScenario.sceneMusicMode)2. Konfigurasikan penangkapan audio lokal
Bagian ini menjelaskan cara mengontrol penangkapan audio lokal, seperti membisukan mikrofon atau menonaktifkan penangkapan mikrofon. Metode utama dan perbedaan mereka adalah sebagai berikut:
Antarmuka | muteLocalMic | stopAudioCapture/startAudioCapture |
Prinsip implementasi | Mengirim frame diam. | Menonaktifkan/Mengaktifkan penangkapan mikrofon. |
Kapan harus dipanggil | Dapat dipanggil sebelum atau sesudah bergabung dengan saluran. | Dipanggil setelah bergabung dengan saluran. |
Melepaskan sumber daya mikrofon | Tidak | Ya |
2.1. Membisukan mikrofon
Gunakan metode muteLocalMic untuk membisukan mikrofon dan input audio eksternal. Metode ini dapat dipanggil sebelum atau sesudah bergabung dengan saluran untuk mengatur status bising.
Berbeda dengan metode stopAudioCapture, metode muteLocalMic tidak melepaskan sumber daya mikrofon. Modul penangkapan dan pengkodean mikrofon tetap berjalan tetapi mengirim frame diam pada bitrate yang sangat rendah.
Mode AliRtcMuteLocalAudioMode yang didukung adalah sebagai berikut:
AliRtcMuteAudioModeDefault | Mode default. Berperilaku sama seperti AliRtcMuteAllAudioMode. |
AliRtcMuteAllAudioMode | Mode bisukan semua. Menghentikan dorongan audio dari mikrofon dan input PCM eksternal. |
AliRtcMuteOnlyMicAudioMode | Mode bisukan hanya mikrofon. Menghentikan dorongan audio hanya dari mikrofon. |
Berikut adalah kode contoh:
// Bisukan semua
mAliRtcEngine.muteLocalMic(true, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteAllAudioMode);
// Batalkan bisu semua
mAliRtcEngine.muteLocalMic(false, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteAllAudioMode);
// Bisukan hanya mikrofon
mAliRtcEngine.muteLocalMic(true, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteOnlyMicAudioMode);2.2. Nonaktifkan atau lanjutkan penangkapan mikrofon
@startuml
autonumber
actor "Developer Client" as userA #cyan
participant "ARTC SDK" as artcsdk #orange
userA -> artcsdk: Buat mesin ARTC
userA -> artcsdk: Panggil joinChannel untuk bergabung dengan saluran dan dorong aliran audio
userA -[#red]> artcsdk: <color:#red>Panggil stopAudioCapture untuk menonaktifkan penangkapan mikrofon
userA -[#red]> artcsdk: <color:#red>Panggil startAudioCapture untuk melanjutkan penangkapan mikrofon
@endumlSecara default, SDK mengaktifkan penangkapan mikrofon ketika pengguna bergabung dengan saluran. Untuk menonaktifkan penangkapan mikrofon, gunakan metode stopAudioCapture. Metode ini melepaskan sumber daya mikrofon dan menghentikan penangkapan audio. Untuk melanjutkan penangkapan mikrofon, gunakan metode startAudioCapture.
// Nonaktifkan penangkapan mikrofon
mAliRtcEngine.stopAudioCapture();
// Lanjutkan penangkapan mikrofon
mAliRtcEngine.startAudioCapture();3. Konfigurasikan pemutaran audio jarak jauh
Bagian ini menjelaskan cara mengontrol pemutaran audio dari pengguna jarak jauh.
3.1. Membisukan pengguna jarak jauh
Gunakan metode muteRemoteAudioPlaying untuk menghentikan atau melanjutkan pemutaran audio dari pengguna jarak jauh tertentu. Metode ini didefinisikan sebagai berikut:
public abstract int muteRemoteAudioPlaying(String uid, boolean mute);Membisukan tidak memengaruhi penarikan atau dekoding aliran audio. Metode ini dapat dipanggil sebelum atau sesudah bergabung dengan saluran.
Membisukan hanya memengaruhi pemutaran audio dari pengguna jarak jauh di klien lokal. Tidak memengaruhi penangkapan audio dari pengguna jarak jauh.
3.2. Atur volume pemutaran untuk pengguna jarak jauh tertentu
Gunakan metode setPlayoutVolume untuk mengontrol volume pemutaran lokal.
/**
* @brief Mengatur volume pemutaran.
* @param volume Volume pemutaran. Nilai berkisar antara 0 hingga 400.
* - 0: Bising
* - <100: Kurangi volume.
* - >100: Tingkatkan volume.
* @return
* - 0: Sukses
* - Nilai bukan nol: Gagal
*/
public abstract int setPlayoutVolume(int volume);Gunakan metode setRemoteAudioVolume untuk mengontrol volume pemutaran pengguna jarak jauh tertentu. Mengatur parameter volume ke 0 memiliki efek yang sama seperti memanggil metode muteRemoteAudioPlaying.
/**
* @brief Menyesuaikan volume audio pengguna jarak jauh tertentu yang diputar di klien lokal.
* @param uid ID pengguna. Ini adalah pengenal unik yang ditetapkan oleh server aplikasi.
* @param volume Volume pemutaran. Nilai berkisar antara 0 hingga 100. 0 berarti bising. 100 berarti volume asli.
* @return
* - 0: Sukses
* - Nilai bukan nol: Gagal
*/
public abstract int setRemoteAudioVolume(String uid, int volume);4. Pemantauan in-ear
Pemantauan in-ear memungkinkan Anda mendengarkan suara yang ditangkap oleh mikrofon melalui headphone.
4.1. Aktifkan pemantauan in-ear
Gunakan metode enableEarBack sebelum atau sesudah bergabung dengan saluran untuk mengaktifkan pemantauan in-ear. Untuk menonaktifkan fitur ini, panggil metode enableEarBack lagi dan atur parameternya ke false.
Aktifkan pemantauan in-ear hanya saat menggunakan headphone.
Android
rtcEngine.enableEarBack(true);iOS
engine.enableEarBack(true)4.2. Atur volume pemantauan in-ear
Gunakan metode setEarBackVolume untuk menyesuaikan volume pemantauan in-ear. Parameter volume menentukan level volume, yang berkisar dari 0 hingga 100. Nilai 0 menunjukkan bising, dan 100 menunjukkan volume asli. Nilai defaultnya adalah 100.
Android
rtcEngine.setEarBackVolume(60);iOS
rtcEngine?.setEarBackVolume(volume)5. Volume pengguna dan callback pembicara aktif
ARTC menyediakan callback volume pengguna dan callback pembicara aktif. Ini membantu aplikasi mendeteksi status berbicara pengguna secara real-time.
Fitur ini dinonaktifkan secara default. Gunakan metode enableAudioVolumeIndication untuk mengaktifkannya. Setelah fitur ini diaktifkan, sistem secara berkala melaporkan volume real-time setiap pengguna dan pembicara aktif saat ini. Informasi ini dapat digunakan untuk mengimplementasikan interaksi UI.
5.1. Aktifkan callback
Gunakan metode enableAudioVolumeIndication untuk mengaktifkan fitur ini dan mengatur parameter seperti frekuensi callback dan koefisien smoothing. Parameter metode adalah sebagai berikut:
interval: Interval callback dalam milidetik (ms). Disarankan mengatur ini ke nilai antara 300 ms dan 500 ms. Nilai minimumnya adalah 10 ms. Mengatur parameter ini ke nilai negatif akan menonaktifkan fitur ini.
smooth: Koefisien smoothing. Nilai yang lebih besar menghasilkan lebih banyak smoothing. Nilai yang lebih kecil menghasilkan performa real-time yang lebih baik. Disarankan mengatur ini ke 3. Nilainya bisa berkisar dari 0 hingga 9.
reportVad: Saklar deteksi pembicara aktif. Atur parameter ini ke 0 untuk menonaktifkan fitur ini atau 1 untuk mengaktifkannya.
Android
mAliRtcEngine.enableAudioVolumeIndication(500, 3,1);iOS
// Callback volume pengguna dan deteksi pembicara aktif
engine.enableAudioVolumeIndication(500, smooth: 3, reportVad: 1)5.2. Implementasikan dan daftarkan callback
Gunakan metode registerAudioVolumeObserver untuk mendaftarkan callback yang relevan. Sistem kemudian memicu callback pada interval yang ditentukan:
Callback
onAudioVolumesecara berkala memberikan informasi volume audio. Anda dapat menggunakan callback ini untuk memantau intensitas berbicara setiap pengguna secara real-time. Sistem secara berkala melaporkan level volume semua pengguna yang terdeteksi, baik lokal maupun jarak jauh. Informasi ini dapat digunakan untuk mengimplementasikan umpan balik UI seperti animasi gelombang suara, indikator volume, atau deteksi bising. Jika `mUserId` adalah "0", volume tersebut adalah untuk pengguna lokal. Jika `mUserId` adalah "1", volume tersebut adalah volume campuran dari semua pengguna jarak jauh. Nilai lainnya mewakili volume pengguna jarak jauh tertentu. `totalVolume` adalah volume total setelah audio dari semua pengguna jarak jauh dicampur.Callback
onActiveSpeakerdipicu oleh fitur Voice Activity Detection (VAD) ketika pembicara aktif baru terdeteksi. Ketika sistem mendeteksi bahwa volume dan durasi berbicara pengguna melebihi ambang batas tertentu, SDK memberi tahu aplikasi melalui callback ini. Anda dapat menggunakan peristiwa ini untuk mengimplementasikan fitur seperti fokus otomatis pada jendela video pembicara dalam konferensi.
Android
private final AliRtcEngine.AliRtcAudioVolumeObserver mAliRtcAudioVolumeObserver = new AliRtcEngine.AliRtcAudioVolumeObserver() {
// Callback volume pengguna
@Override
public void onAudioVolume(List<AliRtcEngine.AliRtcAudioVolume> speakers, int totalVolume){
handler.post(() -> {
if(!speakers.isEmpty()) {
for(AliRtcEngine.AliRtcAudioVolume volume : speakers) {
if("0".equals(volume.mUserId)) {
// Volume pengguna lokal saat ini
} else if ("1".equals(volume.mUserId)) {
// Volume keseluruhan pengguna jarak jauh
} else {
// Volume pengguna jarak jauh
}
}
}
});
}
// Callback deteksi pembicara aktif
@Override
public void onActiveSpeaker(String uid){
// Pembicara aktif
handler.post(() -> {
String mag = "onActiveSpeaker uid:" + uid;
ToastHelper.showToast(AudioBasicUsageActivity.this, mag, Toast.LENGTH_SHORT);
});
}
};
// Daftarkan callback
mAliRtcEngine.registerAudioVolumeObserver(mAliRtcAudioVolumeObserver);iOS
Untuk iOS, Anda tidak perlu memanggil metode untuk mendaftarkan callback. Sebagai gantinya, cukup implementasikan callback yang relevan:
0nAudioVolumeCallback
onActiveSpeaker
func onAudioVolumeCallback(_ array: [AliRtcUserVolumeInfo]?, totalVolume: Int32) {
// Callback volume pengguna
"onAudioVolumeCallback, totalVolume: \(totalVolume)".printLog()
}
func onActiveSpeaker(_ uid: String) {
// Callback pembicara aktif
"onActiveSpeaker, uid: \(uid)".printLog()
}6. Atur rute audio
Rute audio adalah bagian penting dari manajemen perangkat audio. Ini menentukan dan mengelola perangkat audio yang digunakan untuk pemutaran suara selama panggilan. Jenis perangkat utama adalah sebagai berikut:
Perangkat pemutaran internal: Ini biasanya mencakup speaker dan earpiece.
Ketika audio diarahkan ke speaker, suara diputar dengan volume tinggi. Anda dapat mendengarnya tanpa menempelkan ponsel ke telinga. Ini memberikan pengalaman bebas genggam.
Ketika audio diarahkan ke earpiece, suara diputar dengan volume rendah. Anda harus menempelkan ponsel dekat telinga untuk mendengar dengan jelas. Ini memberikan privasi yang lebih baik dan cocok untuk panggilan telepon.
Perangkat eksternal: Ini mencakup perangkat audio eksternal seperti headphone kabel dan headset Bluetooth, serta antarmuka audio profesional seperti sound card eksternal.
SDK memiliki prioritas default untuk rute audio. SDK secara otomatis beralih rute berdasarkan status koneksi periferal. Diagram alir berikut menunjukkan proses beralih:
6.1. Rute audio default
Anda dapat mengatur rute audio default ke earpiece atau speaker sebelum bergabung dengan saluran. Jika Anda tidak mengatur rute default, speaker akan digunakan secara default.
Ketika periferal lain seperti headset Bluetooth atau headphone kabel terputus, perangkat yang ditentukan oleh pengaturan ini digunakan untuk pemutaran.
Jika tidak ada perangkat eksternal yang terhubung dan Anda belum mengatur perangkat saat ini, SDK menggunakan pengaturan default-nya. Speaker digunakan sebagai output default. Untuk mengubah pengaturan default ini, gunakan metode
setDefaultAudioRoutetoSpeakerphone.
/**
* @brief Mengatur apakah output audio default adalah speaker. Defaultnya adalah speaker.
* @param defaultToSpeakerphone
* - true: Mode speaker (default)
* - false: Mode earpiece
* @return
* - 0: Sukses
* - <0: Gagal
*/
public int setDefaultAudioRoutetoSpeakerphone(boolean defaultToSpeakerphone);6.2. Rute audio saat ini
Anda dapat mengatur rute audio saat ini ke earpiece atau speaker saat berada di saluran. Jika Anda tidak mengatur rute saat ini, rute audio default akan digunakan.
Pemanggilan metode ini tidak berpengaruh ketika periferal seperti headphone kabel atau headset Bluetooth terhubung.
Ketika tidak ada perangkat eksternal yang terhubung, gunakan metode enableSpeakerphone untuk menggunakan speaker. Atur parameter ke false untuk menggunakan earpiece. Untuk memeriksa apakah perangkat audio saat ini adalah speaker, gunakan metode isSpeakerOn.
/**
* @brief Mengatur output audio ke earpiece atau speaker.
* @param enable true: Mode speaker (default); false: Mode earpiece
* @return
* - 0: Sukses
* - <0: Gagal
*/
public int enableSpeakerphone(boolean enable);
/**
* @brief Mendapatkan apakah output audio saat ini adalah earpiece atau speaker.
* @return
* - true: Mode speaker;
* - false: Mode earpiece
*/
public boolean isSpeakerOn();6.3. Callback perubahan rute audio
Untuk menerima callback ketika perangkat pemutaran audio berubah, daftarkan dan dengarkan callback berikut.
public abstract class AliRtcEngineEventListener {
/**
* @brief Notifikasi peringatan.
* @details Jika peringatan terjadi di mesin, aplikasi diberi tahu melalui callback ini.
* @param warn Jenis peringatan.
* @param message Pesan peringatan.
*/
public void onOccurWarning(int warn, String message);
}Tabel berikut menunjukkan pemetaan antara nilai balik `warn` dan jenis perangkat.
Nilai balik | Perangkat |
1 | Headset kabel dengan mikrofon |
2 | Earpiece |
3 | Headset kabel tanpa mikrofon |
4 | Speaker |
6 | Perangkat Bluetooth SCO |
7 | Perangkat Bluetooth A2DP |