このトピックでは、バックグラウンドミュージック、効果音、カスタム PCM オーディオストリームなどの外部オーディオソースを ARTC SDK のオーディオストリームにミキシングする方法について説明します。これにより、ミキシングされたオーディオをローカルで再生し、チャンネル内のリモートユーザーにストリーミングできます。
機能説明
ARTC SDK は、外部オーディオをミキシングしてローカルで再生し、リモートユーザーに公開することをサポートしています。この機能により、MP4、WAV、AAC などのフォーマットの録音済みファイルから、リアルタイムの PCM データストリームまで、さまざまなオーディオソースを統合して送信できます。
利用シーン
オーディオファイルストリームの取り込み:効果音、バックグラウンドミュージック、またはナレーションコンテンツをライブストリームに動的に挿入します。例えば、e コマースのライブストリーミング中にプロダクトの通知音をトリガーしたり、ゲームストリーミング中に環境効果音をロードしたりできます。
PCM ストリームの取り込み:リアルタイムの対話型音声サービスに使用されます。例えば、スマートカスタマーサービスシステムの音声合成 (TTS) 出力によって生成された PCM オーディオストリームを取り込むことができます。
サンプルコード
Android: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/PlayAudioFiles/PlayAudioFilesActivity.java
iOS: iOS/ARTCExample/BasicUsage/PlayAudioFiles/PlayAudioFilesVC.swift
事前準備
この機能を実装する前に、次の要件を満たしていることを確認してください:
ARTC アプリケーションを作成し、ApsaraVideo Live コンソールから AppID と AppKey を取得します。
オーディオファイルの再生または公開
仕組み
この機能は、リアルタイムセッション中にオーディオファイルを再生または公開するために設計されています。ユースケースごとに 2 セットの API が提供されています:
伴奏 API:バックグラウンドミュージックや伴奏など、長めのオーディオファイルの再生を目的としています。一度に再生できるオーディオファイルは 1 つだけです。
効果音 API:拍手や笑い声など、短いオーディオクリップの再生に最適化されています。複数の効果音を同時に再生できます。
外部オーディオを再生または公開する前に、まずチャンネルに参加し、プライマリオーディオストリームの公開を開始する必要があります。オーディオストリームが公開されたことを確認するために、onAudioPublishStateChanged コールバックを待つ必要があります。
関連する機能は次のとおりです:
機能 | 伴奏 API | 効果音 API |
オーディオファイルの再生、停止、一時停止、再開 |
|
|
再生進捗の取得と調整 |
| |
オーディオ再生音量の取得と調整 |
|
|
オーディオファイル再生ステータスの報告 | ローカル:
リモート:
| ローカル:
|
オーディオファイル情報の取得 |
| |
伴奏の再生
一度に再生できる伴奏ファイルは 1 つだけです。
チャンネルに参加し、オーディオストリームを公開します。これは SDK でデフォルトで有効になっています。
Android
// 外部オーディオソースを再生するには、まずプライマリオーディオストリームを公開する必要があります。これはデフォルトで有効になっています。 mAliRtcEngine.publishLocalAudioStream(true);iOS
// 外部オーディオソースを再生するには、まずプライマリオーディオストリームを公開する必要があります。これはデフォルトで有効になっています。 engine.publishLocalAudioStream(true)再生の制御
チャンネルに参加してオーディオストリームを公開した後、startAudioAccompany を呼び出して伴奏を再生します。呼び出しが成功すると、ローカルクライアントで onAudioAccompanyStateChanged コールバックがトリガーされ、リモートクライアントで onRemoteAudioAccompanyStarted コールバックがトリガーされます。
再生を制御するには、次の API を使用します:
stopAudioAccompany:再生を停止します。pauseAudioAccompany:再生を一時停止します。resumeAudioAccompany:再生を再開します。getAudioAccompanyDuration、getAudioAccompanyCurrentPosition、setAudioAccompanyPosition:ファイル時間を取得し、再生進捗を制御します。setAudioAccompanyVolume:伴奏のローカル再生音量とリモート公開音量の両方を設定します。getAudioAccompanyPublishVolumeとsetAudioAccompanyPublishVolume:伴奏のリモート再生音量を取得または調整します。getAudioAccompanyPlayoutVolumeとsetAudioAccompanyPlayoutVolume:伴奏のローカル再生音量を取得または調整します。
Android
// 伴奏ファイルのパス。
private String mMixingMusicFilepath = "/assets/music.wav";
// 伴奏再生の設定。
AliRtcEngine.AliRtcAudioAccompanyConfig config = new AliRtcEngine.AliRtcAudioAccompanyConfig();
config.loopCycles = -1; // ループ回数。-1 は無限ループを示します。
config.publishVolume = publishVolume; // 公開音量。範囲:[0-100]。
config.playoutVolume = playbackVolume; // ローカル再生音量。範囲:[0-100]。
config.startPosMs = 0; // 再生開始位置 (ミリ秒)。
// 再生を開始
mAliRtcEngine.startAudioAccompany(mMixingMusicFilepath, config);
// 伴奏の一時停止/再開
mAliRtcEngine.pauseAudioAccompany();
mAliRtcEngine.resumeAudioAccompany();
// 再生を停止
mAliRtcEngine.stopAudioAccompany();
// 伴奏ファイルの時間をミリ秒単位で取得します。このメソッドは startAudioAccompany の後に呼び出してください。そうでない場合は -1 が返されます。
int duration = mAliRtcEngine.getAudioAccompanyDuration();
// 特定のファイルの時間を取得するには、getAudioFileInfo を呼び出します。これはエンジン作成後に呼び出すことができます。結果は onAudioFileInfo コールバックで返されます。
mAliRtcEngine.getAudioFileInfo(filePath);
@Override
public void onAudioFileInfo(AliRtcEngine.AliRtcAudioFileInfo info, AliRtcEngine.AliRtcAudioAccompanyErrorCode errorCode) {
handler.post(() -> {
String msg = "onAudioFileInfo.file:" + info.filePath + "duration:" + info.durationMs + "audioPlayingErrorCode=" + errorCode;
ToastHelper.showToast(PlayAudioFilesActivity.this, msg, Toast.LENGTH_SHORT);
});
}
// 音量の取得/設定。
mAliRtcEngine.setAudioAccompanyVolume(50); // [0, 100]
int publishVolume = mAliRtcEngine.getAudioAccompanyPublishVolume();
mAliRtcEngine.setAudioAccompanyPublishVolume(50);
int playoutVolume = mAliRtcEngine.getAudioAccompanyPlayoutVolume();
mAliRtcEngine.setAudioAccompanyPlayoutVolume(50);
// 再生進捗の取得/設定。
int currPosition = mAliRtcEngine.getAudioAccompanyCurrentPosition(); // 現在の位置 (ミリ秒)。
int targetPosition = 1000; // 例:1000 ミリ秒の時点から再生を開始。
mAliRtcEngine.setAudioAccompanyPosition(targetPosition);iOS
// 伴奏ファイルのパス。
let filePath = Bundle.main.path(forResource: "music", ofType: "wav")
// 伴奏再生の設定。
let config = AliRtcAudioAccompanyConfig()
config.loopCycles = loopCount
config.publishVolume = publishVolume
config.playoutVolume = playoutVolume
config.startPosMs = 0
// 再生を開始。
let result = rtcEngine.startAudioAccompany(withFile: filePath, config: config)
// 再生の一時停止/再開。
rtcEngine.pauseAudioAccompany()
rtcEngine.resumeAudioAccompany()
// 再生を停止。
rtcEngine.stopAudioAccompany()
// 伴奏ファイルの時間をミリ秒単位で取得します。このメソッドは startAudioAccompany の後に呼び出してください。そうでない場合は -1 が返されます。
let duration = rtcEngine.getAudioAccompanyDuration()
// 特定のファイルの時間を取得するには、getAudioFileInfo を呼び出します。これはエンジン作成後に呼び出すことができます。結果は onAudioFileInfo コールバックで返されます。
rtcEngine.getAudioFileInfo(filePath)
func onAudioFileInfo(_ info: AliRtcAudioFileInfo, errorCode: AliRtcAudioAccompanyErrorCode) {
"onAudioFileInfo, filePath: \(info.filePath), durationMs: \(info.durationMs), errorCode: \(errorCode)".printLog()
}
// 音量の取得/設定。
rtcEngine.setAudioAccompanyVolume(50) // 公開音量と再生音量の両方を設定します。範囲:[0-100]。
let audioPublishVolume = rtcEngine.getAudioAccompanyPublishVolume() // 公開音量を取得します。
rtcEngine.setAudioAccompanyPublishVolume(50) // 公開音量を設定します。範囲:[0-100]。
let audioPlayoutVolume = rtcEngine.getAudioAccompanyPlayoutVolume() // ローカル再生音量を取得します。
rtcEngine.setAudioAccompanyPlayoutVolume(50) // ローカル再生音量を設定します。範囲:[0-100]。
// 再生進捗の取得/設定。
let currentPosition = rtcEngine.getAudioAccompanyCurrentPosition() // 現在の位置 (ミリ秒)。
let targetPosition:Int32 = 1000; // 例:1000 ミリ秒の時点から再生を開始。
rtcEngine.setAudioAccompanyPosition(targetPosition)効果音の再生
複数の効果音 (例えば、拍手と笑い声) を一度に再生するには、preloadAudioEffect や playAudioEffect などの API を使用します。
各効果音ファイルには一意の ID が必要です。これらの ID はアプリケーション内で管理する必要があります。
チャンネルに参加し、オーディオストリームを公開します。これは SDK でデフォルトで有効になっています。
Android
// 外部オーディオソースを再生するには、まずプライマリオーディオストリームを公開する必要があります。これはデフォルトで有効になっています。 mAliRtcEngine.publishLocalAudioStream(true);iOS
// 外部オーディオソースを再生するには、まずプライマリオーディオストリームを公開する必要があります。これはデフォルトで有効になっています。 engine.publishLocalAudioStream(true)(オプション) リソースのプリロード
効果音を繰り返し再生する際のパフォーマンスを向上させるには、preloadAudioEffect を呼び出してファイルをメモリにプリロードします。
preloadAudioEffect:指定された効果音ファイルをロードします。ローカルファイルとオンラインファイルの URL の両方をサポートしています。ローカルファイルの使用を推奨します。unloadAudioEffect:効果音ファイルが不要になった場合、この API を呼び出してアンロードし、リソースを解放します。
Android
// 指定された ID とファイルパスで効果音ファイルをプリロードします。ID は定義する必要があります。
mAliRtcEngine.preloadAudioEffect(mCurrSoundID, filePath);
// 指定された ID の効果音ファイルをアンロードします。
mAliRtcEngine.unloadAudioEffect(mCurrSoundID);iOS
// 指定された ID とファイルパスで効果音ファイルをプリロードします。ID は定義する必要があります。
rtcEngine.preloadAudioEffect(withSoundId: self.soundId, filePath: filePath)
// 指定された ID の効果音ファイルをアンロードします。
rtcEngine.unloadAudioEffect(withSoundId: self.currentEffectIndex)再生の制御
チャンネルに参加してオーディオストリームを公開した後、playAudioEffect を呼び出して効果音ファイルを再生します。再生が完了すると、ローカルクライアントで onAudioEffectFinished コールバックがトリガーされます。
再生を制御するには、次の API を使用します:
stopAudioEffect、stopAllAudioEffects:再生を停止します。pauseAudioEffect、pauseAllAudioEffects:再生を一時停止します。resumeAudioEffect、resumeAllAudioEffects:再生を再開します。getAudioEffectPublishVolume、setAudioEffectPublishVolume、setAllAudioEffectsPublishVolume:公開音量を取得または設定します。getAudioEffectPlayoutVolume、setAudioEffectPlayoutVolume、setAllAudioEffectsPlayoutVolume:ローカル再生音量を取得または設定します。
Android
// 効果音を再生します。
AliRtcEngine.AliRtcAudioEffectConfig config = new AliRtcEngine.AliRtcAudioEffectConfig();
config.loopCycles = -1; // 再生ループ回数。-1 は無限ループを示します。
config.startPosMs = 0; // 再生開始位置 (ミリ秒)。
config.publishVolume = 50; // 公開音量。範囲:[0-100]。
config.playoutVolume = 50; // ローカル再生音量。範囲:[0, 100]。
mAliRtcEngine.playAudioEffect(mCurrSoundID, filePath, config);
// 再生を停止します。
mAliRtcEngine.stopAudioEffect(soundId);
mAliRtcEngine.stopAllAudioEffects();
// 再生を一時停止します。
mAliRtcEngine.pauseAudioEffect(soundId);
mAliRtcEngine.pauseAllAudioEffects();
// 再生を再開します。
mAliRtcEngine.resumeAudioEffect(soundId);
mAliRtcEngine.resumeAllAudioEffects();
// 音量を取得または設定します。
// 公開音量。
mAliRtcEngine.getAudioEffectPublishVolume(soundId);
mAliRtcEngine.setAudioEffectPublishVolume(soundId, 50);
mAliRtcEngine.setAllAudioEffectsPublishVolume(50);
// 再生音量。
mAliRtcEngine.getAudioEffectPlayoutVolume(soundId);
mAliRtcEngine.setAudioEffectPlayoutVolume(soundId, 50);
mAliRtcEngine.setAllAudioEffectsPlayoutVolume(50);iOS
// 再生
let config = AliRtcAudioEffectConfig()
config.loopCycles = -1
config.startPosMs = 0
config.publishVolume = 50
config.playoutVolume = 50
let result = rtcEngine.playAudioEffect(withSoundId: self.soundId, filePath: filePath, config: config)
if result != 0 {
UIAlertController.showAlertWithMainThread(msg: "効果音の再生に失敗しました。エラーコード:\(result)", vc: self)
}
// 再生を停止します。
rtcEngine.stopAudioEffect(withSoundId: soundId)
rtcEngine.stopAllAudioEffects()
// 再生を一時停止します。
rtcEngine.pauseAudioEffect(withSoundId: soundId)
rtcEngine.pauseAllAudioEffects()
// 再生を再開します。
rtcEngine.resumeAudioEffect(withSoundId: soundId)
rtcEngine.resumeAllAudioEffects()
// 音量を取得または設定します。
rtcEngine.getAudioEffectPublishVolume(withSoundId: soundId)
rtcEngine.setAudioEffectPublishVolumeWithSoundId(soundId, volume: 50)
rtcEngine.setAllAudioEffectsPublishVolume(50)
rtcEngine.resumeAudioEffect(withSoundId: soundId)
rtcEngine.getAudioEffectPlayoutVolume(withSoundId: soundId)
rtcEngine.setAudioEffectPlayoutVolumeWithSoundId(soundId, volume: 50)PCM オーディオデータの再生または公開
再生または公開する必要があるオーディオデータが PCM フォーマットの場合は、「カスタムオーディオキャプチャ」で説明されているメソッドをご参照ください。
仕組み
サンプルコード
外部入力ストリームの追加
Android
/* 必要に応じてパラメーターを設定します。*/
AliRtcEngine.AliRtcExternalAudioStreamConfig config = new AliRtcEngine.AliRtcExternalAudioStreamConfig();
/* ローカル再生を無効にするには、ローカル再生音量を 0 に設定します。*/
config.playoutVolume = currentAudioPlayoutVolume;
/* 公開を無効にするには、公開音量を 0 に設定します。*/
config.publishVolume = currentAudioPublishVolume;
config.channels = 1;
config.sampleRate = 48000;
// このメソッドは外部入力ストリーム ID を返します。この ID を使用して SDK にデータをプッシュします。
audioStreamID = mAliRtcEngine.addExternalAudioStream(config);iOS
/* 必要に応じてパラメーターを設定します。*/
AliRtcExternalAudioStreamConfig *config = [AliRtcExternalAudioStreamConfig new];
config.channels = _pcmChannels;
config.sampleRate = _pcmSampleRate;
/* ローカル再生を無効にするには、再生音量を 0 に設定します。*/
config.playoutVolume = 0;
/* 公開を無効にするには、公開音量を 100 に設定します。*/
config.publishVolume = 100;
// このメソッドは外部入力ストリーム ID を返します。この ID を使用して SDK にデータをプッシュします。
_externalPlayoutStreamId = [self.engine addExternalAudioStream:config];オーディオストリームへの PCM データのプッシュ
Android
AliRtcEngine.AliRtcAudioFrame rawData = new AliRtcEngine.AliRtcAudioFrame();
rawData.data = frameInfo.audio_data[0];
rawData.numSamples = (int) (frameInfo.audio_data[0].length / (2 * frameInfo.audio_channels));
rawData.bytesPerSample = 2;
rawData.numChannels = frameInfo.audio_channels;
rawData.samplesPerSec = frameInfo.audio_sample_rate;
int ret = mAliRtcEngine.pushExternalAudioStreamRawData(audioStreamID, rawData);
if(ret == 0x01070101) {
// バッファーがいっぱいです。
sleep(20);
} else if(ret < 0) {
/* 例外が発生しました。パラメーターと公開状態を確認してください。*/
}iOS
AliRtcAudioFrame *sample = [AliRtcAudioFrame new];
sample.dataPtr = _pcmLocalData;
sample.samplesPerSec = _pcmLocalSampleRate;
sample.bytesPerSample = sizeof(int16_t);
sample.numOfChannels = _pcmLocalChannels;
sample.numOfSamples = numOfSamples;
int rc = [self.engine pushExternalAudioStream:_externalPlayoutStreamId rawData:sample];
if(rc == 0x01070101) {
// バッファーがいっぱいです。
sleep(20);
} else if(ret < 0) {
/* 例外が発生しました。パラメーターと公開状態を確認してください。*/
}外部オーディオストリームの削除
Android
mAliRtcEngine.removeExternalAudioStream(audioStreamID);iOS
[self.engine removeExternalAudioStream:_externalPublishStreamId];よくある質問
startAudioAccompanyを使用して、マイクの音声ではなく伴奏のみを公開するにはどうすればよいですか?伴奏の再生前または再生中に
muteLocalMicメソッドを呼び出します。これにより、マイク入力がミュートされます。その結果、リモートユーザーには伴奏ストリームの音声のみが聞こえるようになります。