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 :
Une application ARTC (ApsaraVideo Real-time Communication)
Le SDK de base intégré sur votre client Android. Pour obtenir des instructions de configuration, consultez Implémenter les communications audio/vidéo sur Android
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 :
Configurez le profil du canal et le rôle du client.
Définissez le profil audio pour une musique haute qualité.
Générez et encodez le jeton d'authentification.
Rejoignez le canal.

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 |