Buat ruang obrolan suara di Android menggunakan ApsaraVideo Live ARTC SDK. Panduan ini mencakup pembuatan channel, akses berbasis role, kontrol audio, dan musik latar.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Aplikasi ARTC (ApsaraVideo Real-time Communication)
Base SDK yang telah diintegrasikan pada klien Android Anda. Untuk petunjuk penyiapan, lihat Implementasikan komunikasi audio/video di Android.
Cara kerja
Ruang obrolan suara menggunakan ARTC SDK dalam mode hanya audio dengan akses berbasis role:
Streamer (role interaktif): Membuat channel, mempublikasikan audio, dan menerima audio dari semua peserta.
Viewer (role live): Bergabung ke channel yang sudah ada dan menerima audio. Dapat dipromosikan menjadi co-streamer melalui peralihan role.
Alur implementasi:
Konfigurasikan profil channel dan role klien.
Tetapkan profil audio untuk musik berkualitas tinggi.
Buat dan encode token autentikasi.
Bergabung ke channel.

Buat channel sebagai streamer
Inisialisasi SDK dalam mode live interaktif, tetapkan role interaktif, dan bergabung ke channel. SDK secara otomatis berlangganan ke semua aliran audio remote.
// Setel profil channel ke streaming live interaktif
mAliRtcEngine.setChannelProfile(AliRTCSdkInteractiveLive);
// Tetapkan role ke interaktif (streamer dapat mempublikasikan dan menerima audio)
mAliRtcEngine.setClientRole(AliRTCSdkInteractive);
// Gunakan mode musik berkualitas tinggi untuk skenario obrolan suara
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);
// Tetapkan listener untuk callback
mAliRtcEngine.setRtcEngineEventListener(this);
// Publikasikan otomatis aliran audio lokal
mAliRtcEngine.publishLocalAudioStream(true);
// Berlangganan otomatis ke semua aliran audio remote
mAliRtcEngine.setDefaultSubscribeAllRemoteAudioStreams(true);
mAliRtcEngine.subscribeAllRemoteAudioStreams(true);
// Aktifkan mode hanya audio (tanpa video)
mAliRtcEngine.setAudioOnlyMode(true);
// Buat token autentikasi
JSONObject tokenv2 = new JSONObject();
tokenv2.put("appid", userInfo.appId);
tokenv2.put("channelid", userInfo.channelId);
tokenv2.put("userid", userInfo.userId);
tokenv2.put("nonce", userInfo.nonce);
tokenv2.put("timestamp", userInfo.timestamp);
tokenv2.put("gslb",userInfo.gslb);
tokenv2.put("token", userInfo.token);
String base64TokenV2 = Base64.encodeToString(JSON.toJSONBytes(tokenv2),Base64.NO_WRAP);
// Bergabung ke channel dengan token yang diencode Base64
mAliRtcEngine.joinChannel(base64TokenV2, null, null, mUsername);Bergabung ke channel sebagai viewer
Viewer menggunakan alur inisialisasi yang sama seperti streamer, kecuali role klien-nya diatur ke AliRTCSdkLive alih-alih AliRTCSdkInteractive. Hal ini menetapkan pengguna sebagai viewer biasa.
Untuk bergabung sebagai co-streamer, tetapkan role ke AliRTCSdkInteractive.
mAliRtcEngine.setChannelProfile(AliRTCSdkInteractiveLive);
// Tetapkan role ke live (viewer biasa)
mAliRtcEngine.setClientRole(AliRTCSdkLive);
// Gunakan mode musik berkualitas tinggi untuk skenario obrolan suara
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);
// Tetapkan listener untuk callback
mAliRtcEngine.setRtcEngineEventListener(this);
// Publikasikan otomatis aliran audio lokal
mAliRtcEngine.publishLocalAudioStream(true);
// Berlangganan otomatis ke semua aliran audio remote
mAliRtcEngine.setDefaultSubscribeAllRemoteAudioStreams(true);
mAliRtcEngine.subscribeAllRemoteAudioStreams(true);
// Aktifkan mode hanya audio (tanpa video)
mAliRtcEngine.setAudioOnlyMode(true);
// Buat token autentikasi
JSONObject tokenv2 = new JSONObject();
tokenv2.put("appid", userInfo.appId);
tokenv2.put("channelid", userInfo.channelId);
tokenv2.put("userid", userInfo.userId);
tokenv2.put("nonce", userInfo.nonce);
tokenv2.put("timestamp", userInfo.timestamp);
tokenv2.put("gslb",userInfo.gslb);
tokenv2.put("token", userInfo.token);
String base64TokenV2 = Base64.encodeToString(JSON.toJSONBytes(tokenv2),Base64.NO_WRAP);
// Bergabung ke channel dengan token yang diencode Base64
mAliRtcEngine.joinChannel(base64TokenV2, null, null, mUsername);Ubah role viewer
Setelah viewer bergabung ke channel, ubah role secara dinamis:
// Ubah role menjadi streamer untuk pengguna yang telah bergabung ke channel
mAliRtcEngine.setClientRole(AliRTCSdkInteractive);Kontrol volume, efek suara, dan gema
Sesuaikan volume
// Sesuaikan volume perekaman lokal
mAliRtcEngine.setRecordingVolume(volumeLevel);
// Sesuaikan volume pengguna remote tertentu
mAliRtcEngine.setRemoteAudioVolume(uid, volume);
// Sesuaikan volume pemutaran semua suara
mAliRtcEngine.setPlayoutVolume(volume);Terapkan pengubah suara
// Terapkan efek pengubah suara "orang tua"
mAliRtcEngine.setAudioEffectVoiceChangerMode(AliRtcSdk_AudioEffect_Voice_Changer_Oldman);Terapkan gema
// Konfigurasikan gema dengan mengatur ukuran ruangan
mAliRtcEngine.setAudioEffectReverbParamType(AliRtcEngine.AliRtcAudioEffectReverbParamType.AliRtcSdk_AudioEffect_Reverb_Room_Size, value);Mainkan musik latar
Dua metode tersedia: input data PCM mentah dan input berbasis file.
Input data PCM
Buat aliran input musik, lalu dorong frame PCM mentah.
Buat aliran audio eksternal:
AliRtcEngine.AliRtcExternalAudioStreamConfig config = new AliRtcEngine.AliRtcExternalAudioStreamConfig();
config.sampleRate = sampleRate;
config.channels = channels;
// Volume pemutaran lokal iringan (digunakan saat ARTC SDK menangani pemutaran)
config.playoutVolume = 60;
// Volume yang dipublikasikan ke peserta remote
config.publishVolume = 100;
int externalAudioStreamId = aliRtcEngine.addExternalAudioStream(config);Parameter AliRtcExternalAudioStreamConfig:
| Parameter | Deskripsi |
|---|---|
sampleRate | Laju sampel audio |
channels | Jumlah kanal audio |
playoutVolume | Volume pemutaran lokal iringan |
publishVolume | Volume yang dipublikasikan ke peserta remote |
Dorong data PCM:
// Buat frame audio dengan data PCM mentah
AliRtcEngine.AliRtcAudioFrame sample = new AliRtcEngine.AliRtcAudioFrame();
sample.data = buffer;
sample.numSamples = numSamples;
sample.numChannels = channels;
sample.sampleRate = sampleRate;
sample.bytesPerSample = bytesPerSample;
// Dorong data PCM ke aliran audio eksternal
int ret = aliRtcEngine.pushExternalAudioStreamRawData(externalAudioStreamId, sample);Bidang AliRtcAudioFrame:
| Bidang | Deskripsi |
|---|---|
data | Buffer audio PCM mentah |
numSamples | Jumlah sampel audio |
numChannels | Jumlah kanal audio |
sampleRate | Laju sampel audio |
bytesPerSample | Byte per sampel audio |
Input berbasis file
Mulai iringan dari file audio lokal:
AliRtcEngine.AliRtcAudioAccompanyConfig config = new AliRtcEngine.AliRtcAudioAccompanyConfig();
config.onlyLocalPlay = localPlay; // Putar hanya secara lokal, tanpa mempublikasikan
config.replaceMic = replaceMic; // Ganti input mikrofon dengan file
config.loopCycles = loopCycles; // Jumlah putaran pemutaran
config.startPosMs = startPosMs; // Posisi awal dalam milidetik
config.publishVolume = pubVolume; // Volume yang dipublikasikan ke peserta remote
config.playoutVolume = playVolume; // Volume pemutaran lokal
return mAliRtcEngine.startAudioAccompany(audioFileName, config);Parameter AliRtcAudioAccompanyConfig:
| Parameter | Deskripsi |
|---|---|
onlyLocalPlay | Putar hanya secara lokal, tanpa mempublikasikan ke peserta remote |
replaceMic | Ganti input mikrofon dengan file audio |
loopCycles | Jumlah putaran pemutaran |
startPosMs | Posisi awal dalam milidetik |
publishVolume | Volume yang dipublikasikan ke peserta remote |
playoutVolume | Volume pemutaran lokal |