このトピックでは、Alibaba Real-Time Communication (ARTC) SDK での一般的なオーディオ操作と構成について説明します。
機能紹介
ARTC SDK は、オーディオの構成と操作のためのさまざまな機能を提供します。これらの機能は、オーディオエンコーディングとシナリオモードの設定、ローカルオーディオキャプチャと再生の管理、リモートオーディオ再生の制御などの主要な側面をカバーしています。SDK は、インイヤーモニターと柔軟なオーディオルートもサポートしています。
サンプルコード
Android の一般的なオーディオ操作と構成: Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/AudioBasicUsage/AudioBasicUsageActivity.java。
iOS の一般的なオーディオ操作と構成: iOS/ARTCExample/BasicUsage/AudioBasicUsage/AudioBasicUsageVC.swift。
前提条件
有効な Alibaba Cloud アカウントをお持ちで、リアルタイム音声・映像アプリケーションを作成済みであること。 詳細については、「アプリケーションの作成」をご参照ください。 アプリケーション管理コンソールで App ID と App Key を取得できます。
ARTC SDK をプロジェクトに統合し、基本的なリアルタイムの音声およびビデオ通話が実装済みであること。 SDK 統合の詳細については、「SDK のダウンロードと統合」をご参照ください。 音声およびビデオ通話を実装するには、「音声・ビデオ通話の実装」をご参照ください。
実装
1. オーディオエンコーディングとシナリオモードの設定 (チャンネル参加前)
setAudioProfile メソッドを使用して、さまざまな オーディオエンコーディングモード と オーディオシナリオモード を設定できます。これにより、さまざまなビジネスシナリオやユーザー要件に合わせてオーディオ品質を最適化できます。
setAudioProfileメソッドは、チャンネルに参加する前にのみ呼び出すことができます。これらの設定は、チャンネルに参加した後は変更できません。AliRtcEngineHighQualityMode高品質エンコーディングモードとAliRtcSceneMusicMode音楽シナリオモードを使用することをお勧めします。
1.1. オーディオエンコーディングモード (AliRtcAudioProfile)
高品質モード (
AliRtcEngineHighQualityMode) を使用することをお勧めします。Web クライアントと相互運用するには、サンプルレートが 48 kHz のモードを選択します。
デュアルチャンネルオーディオの場合は、モードを
AliRtcEngineStereoHighQualityModeに設定します。
列挙型 | 説明 | サンプルレート | チャンネル数 | 最大エンコーディングビットレート |
AliRtcEngineLowQualityMode | 低品質オーディオモード | 8000 Hz | モノラル | 12 kbps |
AliRtcEngineBasicQualityMode | 標準品質オーディオモード | 16000 Hz | モノラル | 24 kbps |
AliRtcEngineHighQualityMode | 高品質オーディオモード | 48000 Hz | モノラル | 64 kbps |
AliRtcEngineStereoHighQualityMode | ステレオ高品質オーディオモード | 48000 Hz | ステレオ | 80 kbps |
AliRtcEngineSuperHighQualityMode | 超高品質オーディオモード | 48000 Hz | モノラル | 96 kbps |
AliRtcEngineStereoSuperHighQualityMode | ステレオ超高品質オーディオモード | 48000 Hz | ステレオ | 128 kbps |
1.2. オーディオシナリオモード (AliRtcAudioScenario)
列挙型 | 説明 |
AliRtcSceneDefaultMode | ハードウェア 3A を使用し、Bluetooth デバイスからのオーディオキャプチャを許可します。Bluetooth オーディオキャプチャにはこのモードを設定します。 |
AliRtcSceneMusicMode | (推奨) 音楽シナリオモード。ソフトウェア 3A を使用して携帯電話からオーディオをキャプチャし、より高いオーディオ品質を実現します。 |
1.3. サンプルコード
次のコードは、一般的なシナリオでオーディオエンコーディングとシナリオモードを設定する方法の例を示しています。
Bluetooth オーディオキャプチャ
Android
// シナリオを AliRtcSceneDefaultMode に設定します。
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneDefaultMode);iOS
// シナリオを AliRtcSceneDefaultMode に設定します。
engine.setAudioProfile(AliRtcAudioProfile.engineHighQualityMode, audio_scene: AliRtcAudioScenario.sceneDefaultMode)Web クライアントとの相互運用性
Android
// エンコーディングモードを 48 kHz のサンプルレートを持つもの (AliRtcEngineHighQualityMode など) に設定します。
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);iOS
// エンコーディングモードを 48 kHz のサンプルレートを持つもの (AliRtcEngineHighQualityMode など) に設定します。
engine.setAudioProfile(AliRtcAudioProfile.engineHighQualityMode, audio_scene: AliRtcAudioScenario.sceneMusicMode)デュアルチャンネルオーディオ
Android
// モードをステレオを含むもの (AliRtcEngineStereoHighQualityMode など) に設定します。
mAliRtcEngine.setAudioProfile(AliRtcEngineStereoHighQualityMode, AliRtcSceneMusicMode);iOS
// モードをステレオを含むもの (AliRtcEngineStereoHighQualityMode など) に設定します。
engine.setAudioProfile(AliRtcAudioProfile.engineStereoHighQualityMode, audio_scene: AliRtcAudioScenario.sceneMusicMode)2. ローカルオーディオキャプチャの構成
このセクションでは、マイクのミュートやマイクキャプチャの無効化など、ローカルオーディオキャプチャを制御する方法について説明します。主なメソッドとその違いは次のとおりです。
インターフェイス | muteLocalMic | stopAudioCapture/startAudioCapture |
実装原理 | 無音フレームを送信します。 | マイクキャプチャを無効化/有効化します。 |
呼び出すタイミング | チャンネル参加前または参加後に呼び出すことができます。 | チャンネル参加後に呼び出します。 |
マイクのリソースを解放 | いいえ | はい |
2.1. マイクのミュート
muteLocalMic メソッドを使用して、マイクと外部オーディオ入力をミュートできます。このメソッドは、チャンネルに参加する前または後に呼び出して、ミュート状態を設定できます。
stopAudioCapture メソッドとは異なり、muteLocalMic メソッドはマイクのリソースを解放しません。マイクのキャプチャおよびエンコーディングモジュールは実行を継続しますが、非常に低いビットレートで無音フレームを送信します。
サポートされている AliRtcMuteLocalAudioMode モードは次のとおりです。
AliRtcMuteAudioModeDefault | デフォルトモード。AliRtcMuteAllAudioMode と同じように動作します。 |
AliRtcMuteAllAudioMode | すべてミュートモード。マイクと外部 PCM 入力の両方からのオーディオプッシュを停止します。 |
AliRtcMuteOnlyMicAudioMode | マイクのみミュートモード。マイクからのみのオーディオプッシュを停止します。 |
以下はサンプルコードです。
// すべてミュート
mAliRtcEngine.muteLocalMic(true, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteAllAudioMode);
// すべてミュート解除
mAliRtcEngine.muteLocalMic(false, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteAllAudioMode);
// マイクのみミュート
mAliRtcEngine.muteLocalMic(true, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteOnlyMicAudioMode);2.2. マイクキャプチャの無効化または再開
@startuml
autonumber
actor "開発者クライアント" as userA #cyan
participant "ARTC SDK" as artcsdk #orange
userA -> artcsdk: ARTC エンジンを作成
userA -> artcsdk: joinChannel を呼び出してチャンネルに参加し、オーディオストリームをプッシュ
userA -[#red]> artcsdk: <color:#red>stopAudioCapture を呼び出してマイクキャプチャを無効化
userA -[#red]> artcsdk: <color:#red>startAudioCapture を呼び出してマイクキャプチャを再開
@endumlデフォルトでは、ユーザーがチャンネルに参加すると、SDK はマイクキャプチャを有効にします。マイクキャプチャを無効にするには、stopAudioCapture メソッドを呼び出します。このメソッドはマイクのリソースを解放し、オーディオキャプチャを停止します。マイクキャプチャを再開するには、startAudioCapture メソッドを呼び出します。
// マイクキャプチャを無効化
mAliRtcEngine.stopAudioCapture();
// マイクキャプチャを再開
mAliRtcEngine.startAudioCapture();3. リモートオーディオ再生の構成
このセクションでは、リモートユーザーからのオーディオ再生を制御する方法について説明します。
3.1. リモートユーザーのミュート
muteRemoteAudioPlaying メソッドを使用して、指定したリモートユーザーからのオーディオ再生を停止または再開できます。メソッドは次のように定義されます。
public abstract int muteRemoteAudioPlaying(String uid, boolean mute);ミュートは、オーディオストリームのフェッチングやデコードには影響しません。このメソッドは、チャンネルに参加する前または後に呼び出すことができます。
ミュートは、ローカルクライアントでのリモートユーザーからのオーディオ再生にのみ影響します。リモートユーザーのオーディオキャプチャには影響しません。
3.2. 指定したリモートユーザーの再生音量を設定する
setPlayoutVolume メソッドを使用して、ローカルの再生音量を制御できます。
/**
* @brief 再生音量を設定します。
* @param volume 再生音量。値の範囲は 0 から 400 です。
* - 0: ミュート
* - <100: 音量を下げます。
* - >100: 音量を上げます。
* @return
* - 0: 成功
* - 0 以外の値: 失敗
*/
public abstract int setPlayoutVolume(int volume);setRemoteAudioVolume メソッドを使用して、指定したリモートユーザーの再生音量を制御できます。volume パラメーターを 0 に設定すると、muteRemoteAudioPlaying メソッドを呼び出すのと同じ効果があります。
/**
* @brief ローカルクライアントで再生される指定されたリモートユーザーのオーディオの音量を調整します。
* @param uid ユーザー ID。これは、アプリサーバーによって割り当てられた一意の識別子です。
* @param volume 再生音量。値の範囲は 0 から 100 です。0 はミュートを意味します。100 は元の音量を意味します。
* @return
* - 0: 成功
* - 0 以外の値: 失敗
*/
public abstract int setRemoteAudioVolume(String uid, int volume);4. インイヤーモニター
インイヤーモニターを使用すると、マイクでキャプチャした音をヘッドフォンで聞くことができます。
4.1. インイヤーモニターの有効化
チャンネルに参加する前または後に enableEarBack メソッドを呼び出して、インイヤーモニターを有効にすることができます。この機能を無効にするには、enableEarBack メソッドを再度呼び出し、パラメーターを false に設定します。
インイヤーモニターは、ヘッドフォンを装着している場合にのみ有効にしてください。
Android
rtcEngine.enableEarBack(true);iOS
engine.enableEarBack(true)4.2. インイヤーモニターの音量を設定する
setEarBackVolume メソッドを呼び出して、インイヤーモニターの音量を調整できます。volume パラメーターは音量レベルを指定し、範囲は 0 から 100 です。値 0 はミュートを示し、100 は元の音量を示します。デフォルト値は 100 です。
Android
rtcEngine.setEarBackVolume(60);iOS
rtcEngine?.setEarBackVolume(volume)5. ユーザー音量とアクティブスピーカーのコールバック
ARTC は、ユーザー音量コールバックとアクティブスピーカーコールバックを提供します。これにより、アプリケーションはユーザーの発話状態をリアルタイムで検出できます。
この機能はデフォルトで無効になっています。enableAudioVolumeIndication メソッドを呼び出して有効にすることができます。この機能が有効になると、システムは各ユーザーのリアルタイムの音量と現在のアクティブスピーカーを定期的に報告します。この情報を使用して UI インタラクションを実装できます。
5.1. コールバックの有効化
enableAudioVolumeIndication メソッドを呼び出して機能を有効にし、コールバックの頻度や平滑化係数などのパラメーターを設定できます。メソッドのパラメーターは次のとおりです。
interval: コールバック間隔 (ミリ秒、ms)。300 ms から 500 ms の間の値に設定することをお勧めします。最小値は 10 ms です。このパラメーターに負の値を設定すると、機能が無効になります。
smooth: 平滑化係数。値が大きいほど平滑化が強くなります。値が小さいほど平滑化が弱くなり、リアルタイムパフォーマンスが向上します。3 に設定することをお勧めします。値の範囲は 0 から 9 です。
reportVad: アクティブスピーカー検出スイッチ。このパラメーターを 0 に設定すると機能が無効になり、1 に設定すると有効になります。
Android
mAliRtcEngine.enableAudioVolumeIndication(500, 3,1);iOS
// ユーザー音量コールバックとアクティブスピーカー検出
engine.enableAudioVolumeIndication(500, smooth: 3, reportVad: 1)5.2. コールバックの実装と登録
registerAudioVolumeObserver メソッドを呼び出して、関連するコールバックを登録できます。システムは、指定された間隔でコールバックをトリガーします。
onAudioVolumeコールバックは、定期的にオーディオ音量情報を提供します。このコールバックを使用して、各ユーザーの発話強度をリアルタイムで監視できます。システムは、ローカルとリモートの両方で検出されたすべてのユーザーの音量レベルを定期的に報告します。この情報を使用して、音波アニメーション、音量インジケーター、ミュート検出などの UI フィードバックを実装できます。`mUserId` が "0" の場合、音量はローカルユーザーのものです。`mUserId` が "1" の場合、音量はすべてのリモートユーザーの混合音量です。その他の値は、特定のリモートユーザーの音量を表します。`totalVolume` は、すべてのリモートユーザーからのオーディオが混合された後の合計音量です。onActiveSpeakerコールバックは、新しいアクティブスピーカーが検出されたときに、音声アクティビティ検出 (VAD) 機能によってトリガーされます。システムがユーザーの発話音量と持続時間が指定されたしきい値を超えたことを検出すると、SDK はこのコールバックを通じてアプリケーションに通知します。このイベントを使用して、会議でスピーカーのビデオウィンドウに自動的にフォーカスするなどの機能を実装できます。
Android
private final AliRtcEngine.AliRtcAudioVolumeObserver mAliRtcAudioVolumeObserver = new AliRtcEngine.AliRtcAudioVolumeObserver() {
// ユーザー音量コールバック
@Override
public void onAudioVolume(List<AliRtcEngine.AliRtcAudioVolume> speakers, int totalVolume){
handler.post(() -> {
if(!speakers.isEmpty()) {
for(AliRtcEngine.AliRtcAudioVolume volume : speakers) {
if("0".equals(volume.mUserId)) {
// 現在のローカルユーザーの音量
} else if ("1".equals(volume.mUserId)) {
// リモートユーザーの全体的な音量
} else {
// リモートユーザーの音量
}
}
}
});
}
// アクティブスピーカー検出コールバック
@Override
public void onActiveSpeaker(String uid){
// アクティブスピーカー
handler.post(() -> {
String mag = "onActiveSpeaker uid:" + uid;
ToastHelper.showToast(AudioBasicUsageActivity.this, mag, Toast.LENGTH_SHORT);
});
}
};
// コールバックを登録
mAliRtcEngine.registerAudioVolumeObserver(mAliRtcAudioVolumeObserver);iOS
iOS の場合、コールバックを登録するためのメソッドを呼び出す必要はありません。代わりに、関連するコールバックを実装するだけで済みます。
0nAudioVolumeCallback
onActiveSpeaker
func onAudioVolumeCallback(_ array: [AliRtcUserVolumeInfo]?, totalVolume: Int32) {
// ユーザー音量コールバック
"onAudioVolumeCallback, totalVolume: \(totalVolume)".printLog()
}
func onActiveSpeaker(_ uid: String) {
// アクティブスピーカーコールバック
"onActiveSpeaker, uid: \(uid)".printLog()
}6. オーディオルートの設定
オーディオルートは、オーディオデバイス管理の重要な部分です。通話中の音声再生に使用されるオーディオデバイスを決定および管理します。主なデバイスタイプは次のとおりです。
内蔵再生デバイス: これらには通常、スピーカーとイヤピースが含まれます。
オーディオがスピーカーにルーティングされると、サウンドは大きな音量で再生されます。電話を耳に当てなくても聞こえます。これにより、ハンズフリー体験が提供されます。
オーディオがイヤピースにルーティングされると、サウンドは小さな音量で再生されます。はっきりと聞くには、電話を耳に近づける必要があります。これにより、プライバシーが向上し、電話に適しています。
外部デバイス: これらには、有線ヘッドフォンや Bluetooth ヘッドセットなどの外部オーディオデバイス、および外部サウンドカードなどのプロフェッショナルオーディオインターフェイスが含まれます。
SDK には、オーディオルートの優先順位が事前に定義されています。SDK は、周辺機器の接続状態に基づいてルートを自動的に切り替えます。次のフローチャートは、切り替えプロセスを示しています。
6.1. デフォルトのオーディオルート
チャンネルに参加する前に、デフォルトのオーディオルートをイヤピースまたはスピーカーに設定できます。デフォルトルートを設定しない場合、デフォルトでスピーカーが使用されます。
Bluetooth ヘッドセットや有線ヘッドフォンなどの他の周辺機器が切断されると、この設定で指定されたデバイスが再生に使用されます。
外部デバイスが接続されておらず、現在のデバイスを設定していない場合、SDK はデフォルト設定を使用します。SDK はスピーカーをデフォルトの出力として使用します。このデフォルト設定を変更するには、
setDefaultAudioRoutetoSpeakerphoneメソッドを呼び出します。
/**
* @brief デフォルトのオーディオ出力がスピーカーであるかどうかを設定します。デフォルトはスピーカーです。
* @param defaultToSpeakerphone
* - true: スピーカーモード (デフォルト)
* - false: イヤピースモード
* @return
* - 0: 成功
* - <0: 失敗
*/
public int setDefaultAudioRoutetoSpeakerphone(boolean defaultToSpeakerphone);6.2. 現在のオーディオルート
チャンネル内で現在のオーディオルートをイヤピースまたはスピーカーに設定できます。現在のルートを設定しない場合、デフォルトのオーディオルートが使用されます。
このメソッド呼び出しは、有線ヘッドフォンや Bluetooth ヘッドセットなどの周辺機器が接続されている場合は効果がありません。
外部デバイスが接続されていない場合、enableSpeakerphone メソッドを呼び出してスピーカーを使用できます。パラメーターを false に設定するとイヤピースが使用されます。現在のオーディオデバイスがスピーカーであるかどうかを確認するには、isSpeakerOn メソッドを呼び出します。
/**
* @brief オーディオ出力をイヤピースまたはスピーカーに設定します。
* @param enable true: スピーカーモード (デフォルト); false: イヤピースモード
* @return
* - 0: 成功
* - <0: 失敗
*/
public int enableSpeakerphone(boolean enable);
/**
* @brief 現在のオーディオ出力がイヤピースかスピーカーかを取得します。
* @return
* - true: スピーカーモード;
* - false: イヤピースモード
*/
public boolean isSpeakerOn();6.3. オーディオルート変更コールバック
オーディオ再生デバイスが変更されたときにコールバックを受信するには、次のコールバックを登録してリッスンします。
public abstract class AliRtcEngineEventListener {
/**
* @brief 警告通知。
* @details エンジンで警告が発生した場合、アプリはこのコールバックを通じて通知されます。
* @param warn 警告タイプ。
* @param message 警告メッセージ。
*/
public void onOccurWarning(int warn, String message);
}次の表は、`warn` の戻り値とデバイスタイプのマッピングを示しています。
戻り値 | デバイス |
1 | マイク付き有線ヘッドセット |
2 | イヤピース |
3 | マイクなし有線ヘッドセット |
4 | スピーカー |
6 | SCO Bluetooth デバイス |
7 | A2DP Bluetooth デバイス |