Tous les produits
Search
Centre de documentation

ApsaraVideo Live:Integrate the voice chat room SDK on Android

Dernière mise à jour :Aug 08, 2026

Créez un salon vocal sur Android à l'aide du SDK ApsaraVideo Live ARTC. Ce guide couvre la création de canal, l'accès basé sur les rôles, les commandes audio et la musique de fond.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

Fonctionnement

Un salon vocal utilise le SDK ARTC en mode audio uniquement avec un accès basé sur les rôles :

  • Streamer (rôle interactif) : Crée le canal, publie l'audio et reçoit l'audio de tous les participants.

  • Viewer (rôle live) : Rejoint un canal existant et reçoit l'audio. Il peut être promu au rang de co-streamer via un changement de rôle.

Flux d'implémentation :

  1. Configurez le profil du canal et le rôle du client.

  2. Définissez le profil audio pour une musique haute qualité.

  3. Générez et encodez le jeton d'authentification.

  4. Rejoignez le canal.

Implementation diagram

Créer un canal en tant que streamer

Initialisez le SDK en mode live interactif, définissez le rôle interactif et rejoignez le canal. Le SDK s'abonne automatiquement à tous les flux audio distants.

// Set channel profile to interactive live streaming
mAliRtcEngine.setChannelProfile(AliRTCSdkInteractiveLive);
// Set the role to interactive (streamer can publish and receive audio)
mAliRtcEngine.setClientRole(AliRTCSdkInteractive);
// Use high-quality music mode for voice chat scenarios
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);

// Set the listener for callbacks
mAliRtcEngine.setRtcEngineEventListener(this);
// Auto-publish local audio
mAliRtcEngine.publishLocalAudioStream(true);
// Auto-subscribe to all remote audio streams
mAliRtcEngine.setDefaultSubscribeAllRemoteAudioStreams(true);
mAliRtcEngine.subscribeAllRemoteAudioStreams(true);
// Enable audio-only mode (no video)
mAliRtcEngine.setAudioOnlyMode(true);

// Build the authentication token
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);
// Join the channel with the Base64-encoded token
mAliRtcEngine.joinChannel(base64TokenV2, null, null, mUsername);

Rejoindre un canal en tant que viewer

Le viewer suit le même flux d'initialisation que le streamer, sauf que le rôle du client est défini sur AliRTCSdkLive au lieu de AliRTCSdkInteractive. Cela désigne l'utilisateur comme un viewer ordinaire.

Pour rejoindre en tant que co-streamer, définissez le rôle sur AliRTCSdkInteractive.

mAliRtcEngine.setChannelProfile(AliRTCSdkInteractiveLive);
// Set the role to live (ordinary viewer)
mAliRtcEngine.setClientRole(AliRTCSdkLive);
// Use high-quality music mode for voice chat scenarios
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);

// Set the listener for callbacks
mAliRtcEngine.setRtcEngineEventListener(this);
// Auto-publish local audio
mAliRtcEngine.publishLocalAudioStream(true);
// Auto-subscribe to all remote audio streams
mAliRtcEngine.setDefaultSubscribeAllRemoteAudioStreams(true);
mAliRtcEngine.subscribeAllRemoteAudioStreams(true);
// Enable audio-only mode (no video)
mAliRtcEngine.setAudioOnlyMode(true);

// Build the authentication token
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);
// Join the channel with the Base64-encoded token
mAliRtcEngine.joinChannel(base64TokenV2, null, null, mUsername);

Changer le rôle du viewer

Une fois que le viewer a rejoint le canal, changez le rôle dynamiquement :

// Switch the role to streamer for a user who has joined the channel
mAliRtcEngine.setClientRole(AliRTCSdkInteractive);

Contrôler le volume, les effets vocaux et la réverbération

Ajuster le volume

// Adjust the local recording volume
mAliRtcEngine.setRecordingVolume(volumeLevel);
// Adjust the volume of a specific remote user
mAliRtcEngine.setRemoteAudioVolume(uid, volume);
// Adjust the playback volume of all sounds
mAliRtcEngine.setPlayoutVolume(volume);

Appliquer un modificateur de voix

// Apply the "old man" voice changer effect
mAliRtcEngine.setAudioEffectVoiceChangerMode(AliRtcSdk_AudioEffect_Voice_Changer_Oldman);

Appliquer la réverbération

// Configure reverberation by setting room size
mAliRtcEngine.setAudioEffectReverbParamType(AliRtcEngine.AliRtcAudioEffectReverbParamType.AliRtcSdk_AudioEffect_Reverb_Room_Size, value);

Lire de la musique de fond

Deux méthodes sont disponibles : entrée de données PCM brutes et entrée basée sur un fichier.

Entrée de données PCM

Créez un flux d'entrée musicale, puis envoyez les trames PCM brutes.

Créer le flux audio externe :

AliRtcEngine.AliRtcExternalAudioStreamConfig config = new AliRtcEngine.AliRtcExternalAudioStreamConfig();
config.sampleRate = sampleRate;
config.channels = channels;
// Local playback volume of the accompaniment (used when the ARTC SDK handles playback)
config.playoutVolume = 60;
// Volume published to remote participants
config.publishVolume = 100;
int externalAudioStreamId = aliRtcEngine.addExternalAudioStream(config);

Paramètres de AliRtcExternalAudioStreamConfig :

Paramètre Description
sampleRate Fréquence d'échantillonnage audio
channels Nombre de canaux audio
playoutVolume Volume de lecture local de l'accompagnement
publishVolume Volume publié vers les participants distants

Envoyer les données PCM :

// Build an audio frame with raw PCM data
AliRtcEngine.AliRtcAudioFrame sample = new AliRtcEngine.AliRtcAudioFrame();
sample.data = buffer;
sample.numSamples = numSamples;
sample.numChannels = channels;
sample.sampleRate = sampleRate;
sample.bytesPerSample = bytesPerSample;
// Push the PCM data to the external audio stream
int ret = aliRtcEngine.pushExternalAudioStreamRawData(externalAudioStreamId, sample);

Champs de AliRtcAudioFrame :

Champ Description
data Tampon audio PCM brut
numSamples Nombre d'échantillons audio
numChannels Nombre de canaux audio
sampleRate Fréquence d'échantillonnage audio
bytesPerSample Octets par échantillon audio

Entrée basée sur un fichier

Démarrez l'accompagnement à partir d'un fichier audio local :

AliRtcEngine.AliRtcAudioAccompanyConfig config = new AliRtcEngine.AliRtcAudioAccompanyConfig();
config.onlyLocalPlay = localPlay;       // Play locally only, without publishing
config.replaceMic = replaceMic;         // Replace microphone input with the file
config.loopCycles = loopCycles;         // Number of playback loops
config.startPosMs = startPosMs;         // Start position in milliseconds
config.publishVolume = pubVolume;       // Volume published to remote participants
config.playoutVolume = playVolume;      // Local playback volume
return mAliRtcEngine.startAudioAccompany(audioFileName, config);

Paramètres de AliRtcAudioAccompanyConfig :

Paramètre Description
onlyLocalPlay Lecture locale uniquement, sans publication vers les participants distants
replaceMic Remplacer l'entrée du microphone par le fichier audio
loopCycles Nombre de boucles de lecture
startPosMs Position de départ en millisecondes
publishVolume Volume publié vers les participants distants
playoutVolume Volume de lecture local