All Products
Search
Document Center

ApsaraVideo Live:Integrasikan SDK ruang obrolan suara di Android

Last Updated:Mar 01, 2026

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:

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:

  1. Konfigurasikan profil channel dan role klien.

  2. Tetapkan profil audio untuk musik berkualitas tinggi.

  3. Buat dan encode token autentikasi.

  4. Bergabung ke channel.

Implementation diagram

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:

ParameterDeskripsi
sampleRateLaju sampel audio
channelsJumlah kanal audio
playoutVolumeVolume pemutaran lokal iringan
publishVolumeVolume 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:

BidangDeskripsi
dataBuffer audio PCM mentah
numSamplesJumlah sampel audio
numChannelsJumlah kanal audio
sampleRateLaju sampel audio
bytesPerSampleByte 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:

ParameterDeskripsi
onlyLocalPlayPutar hanya secara lokal, tanpa mempublikasikan ke peserta remote
replaceMicGanti input mikrofon dengan file audio
loopCyclesJumlah putaran pemutaran
startPosMsPosisi awal dalam milidetik
publishVolumeVolume yang dipublikasikan ke peserta remote
playoutVolumeVolume pemutaran lokal