ApsaraVideo Live ARTC SDK を使用して、Android 上に音声チャットルームを構築します。このガイドでは、チャンネルの作成、ロールベースのアクセス、オーディオコントロール、バックグラウンドミュージックについて説明します。
前提条件
開始する前に、以下が準備できていることを確認してください。
ApsaraVideo Real-time Communication (ARTC) アプリケーション
Android クライアントにベース SDK が統合されていること。セットアップ手順については、「Android でオーディオ/ビデオ通信を実装する」をご参照ください。
仕組み
音声チャットルームでは、ARTC SDK を音声のみモードで使用し、ロールベースのアクセス制御を行います。
ストリーマー (インタラクティブロール):チャンネルを作成し、音声を公開し、すべての参加者から音声を受信します。
視聴者 (ライブロール):既存のチャンネルに参加し、音声を受信します。ロールの切り替えによって共同ストリーマーに昇格できます。
実装フロー:
チャンネルプロファイルとクライアントロールを設定します。
高品質の音楽用にオーディオプロファイルを設定します。
認証トークンを構築してエンコードします。
チャンネルに参加します。

ストリーマーとしてのチャンネル作成
SDK をインタラクティブライブモードで初期化し、インタラクティブロールを設定してチャンネルに参加します。SDK は、すべてのリモートオーディオストリームを自動的にサブスクライブします。
// チャンネルプロファイルをインタラクティブライブストリーミングに設定
mAliRtcEngine.setChannelProfile(AliRTCSdkInteractiveLive);
// ロールをインタラクティブに設定 (ストリーマーは音声を公開および受信可能)
mAliRtcEngine.setClientRole(AliRTCSdkInteractive);
// 音声チャットシナリオでは高品質音楽モードを使用
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);
// コールバック用のリスナーを設定
mAliRtcEngine.setRtcEngineEventListener(this);
// ローカルオーディオを自動公開
mAliRtcEngine.publishLocalAudioStream(true);
// すべてのリモートオーディオストリームを自動サブスクライブ
mAliRtcEngine.setDefaultSubscribeAllRemoteAudioStreams(true);
mAliRtcEngine.subscribeAllRemoteAudioStreams(true);
// 音声のみモードを有効化 (ビデオなし)
mAliRtcEngine.setAudioOnlyMode(true);
// 認証トークンを構築
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);
// Base64 でエンコードされたトークンでチャンネルに参加
mAliRtcEngine.joinChannel(base64TokenV2, null, null, mUsername);視聴者としてのチャンネル参加
視聴者は、ストリーマーと同じ初期化フローを使用しますが、クライアントロールが AliRTCSdkLive に設定される点が異なります(ストリーマーの場合は AliRTCSdkInteractive です)。これにより、ユーザーは通常の視聴者として指定されます。
共同ストリーマーとして参加するには、ロールを AliRTCSdkInteractive に設定します。
mAliRtcEngine.setChannelProfile(AliRTCSdkInteractiveLive);
// ロールをライブ (一般視聴者) に設定
mAliRtcEngine.setClientRole(AliRTCSdkLive);
// 音声チャットシナリオでは高品質音楽モードを使用
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);
// コールバック用のリスナーを設定
mAliRtcEngine.setRtcEngineEventListener(this);
// ローカルオーディオを自動公開
mAliRtcEngine.publishLocalAudioStream(true);
// すべてのリモートオーディオストリームを自動サブスクライブ
mAliRtcEngine.setDefaultSubscribeAllRemoteAudioStreams(true);
mAliRtcEngine.subscribeAllRemoteAudioStreams(true);
// 音声のみモードを有効化 (ビデオなし)
mAliRtcEngine.setAudioOnlyMode(true);
// 認証トークンを構築
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);
// Base64 でエンコードされたトークンでチャンネルに参加
mAliRtcEngine.joinChannel(base64TokenV2, null, null, mUsername);視聴者ロールの切り替え
視聴者がチャンネルに参加した後、ロールを動的に切り替えます。
// チャンネルに参加したユーザーのロールをストリーマーに切り替え
mAliRtcEngine.setClientRole(AliRTCSdkInteractive);ボリューム、音声エフェクト、リバーブのコントロール
ボリュームの調整
// ローカル録音ボリュームを調整
mAliRtcEngine.setRecordingVolume(volumeLevel);
// 特定のリモートユーザーのボリュームを調整
mAliRtcEngine.setRemoteAudioVolume(uid, volume);
// すべてのサウンドの再生ボリュームを調整
mAliRtcEngine.setPlayoutVolume(volume);ボイスチェンジャーの適用
// 「老人」ボイスチェンジャーエフェクトを適用
mAliRtcEngine.setAudioEffectVoiceChangerMode(AliRtcSdk_AudioEffect_Voice_Changer_Oldman);リバーブの適用
// ルームサイズを設定してリバーブを構成
mAliRtcEngine.setAudioEffectReverbParamType(AliRtcEngine.AliRtcAudioEffectReverbParamType.AliRtcSdk_AudioEffect_Reverb_Room_Size, value);バックグラウンドミュージックの再生
raw PCM データ入力とファイルベース入力の 2 つのメソッドが利用可能です。
PCM データ入力
音楽入力ストリームを作成し、raw PCM フレームをプッシュします。
外部オーディオストリームの作成:
AliRtcEngine.AliRtcExternalAudioStreamConfig config = new AliRtcEngine.AliRtcExternalAudioStreamConfig();
config.sampleRate = sampleRate;
config.channels = channels;
// 伴奏のローカル再生ボリューム (ARTC SDK が再生を処理する場合に使用)
config.playoutVolume = 60;
// リモート参加者に公開されるボリューム
config.publishVolume = 100;
int externalAudioStreamId = aliRtcEngine.addExternalAudioStream(config);AliRtcExternalAudioStreamConfig のパラメーター:
| パラメーター | 説明 |
|---|---|
sampleRate | オーディオサンプルレート |
channels | オーディオチャンネル数 |
playoutVolume | 伴奏のローカル再生ボリューム |
publishVolume | リモート参加者に公開されるボリューム |
PCM データのプッシュ:
// raw PCM データでオーディオフレームを構築
AliRtcEngine.AliRtcAudioFrame sample = new AliRtcEngine.AliRtcAudioFrame();
sample.data = buffer;
sample.numSamples = numSamples;
sample.numChannels = channels;
sample.sampleRate = sampleRate;
sample.bytesPerSample = bytesPerSample;
// PCM データを外部オーディオストリームにプッシュ
int ret = aliRtcEngine.pushExternalAudioStreamRawData(externalAudioStreamId, sample);AliRtcAudioFrame のフィールド:
| フィールド | 説明 |
|---|---|
data | raw PCM オーディオバッファー |
numSamples | オーディオサンプル数 |
numChannels | オーディオチャンネル数 |
sampleRate | オーディオサンプルレート |
bytesPerSample | オーディオサンプルあたりのバイト数 |
ファイルベースの入力
ローカルオーディオファイルから伴奏を開始します。
AliRtcEngine.AliRtcAudioAccompanyConfig config = new AliRtcEngine.AliRtcAudioAccompanyConfig();
config.onlyLocalPlay = localPlay; // ローカルでのみ再生し、公開しない
config.replaceMic = replaceMic; // マイク入力をファイルで置き換え
config.loopCycles = loopCycles; // 再生ループ回数
config.startPosMs = startPosMs; // ミリ秒単位の開始位置
config.publishVolume = pubVolume; // リモート参加者に公開されるボリューム
config.playoutVolume = playVolume; // ローカル再生ボリューム
return mAliRtcEngine.startAudioAccompany(audioFileName, config);AliRtcAudioAccompanyConfig のパラメーター:
| パラメーター | 説明 |
|---|---|
onlyLocalPlay | ローカルでのみ再生し、リモート参加者には公開しない |
replaceMic | マイク入力をオーディオファイルで置き換える |
loopCycles | 再生ループ回数 |
startPosMs | ミリ秒単位の開始位置 |
publishVolume | リモート参加者に公開されるボリューム |
playoutVolume | ローカル再生ボリューム |