カスタム音声再生は、高度なスキルを持つ開発者に音声再生プロセスの完全制御を提供し、特定の要件を満たすことを目的としています。ARTC は、このようなユースケース向けにこの機能を提供します。
概要
デフォルトでは、ARTC には実地検証済みの音声再生モジュールが組み込まれており、ほとんどの再生要件を満たします。ただし、既存のカスタム音声再生モジュールをお持ちの場合、または再生前に音声データを後処理する必要がある場合は、ARTC のカスタム音声再生機能をご利用ください。これにより、内部再生ロジックを無効化し、音声データの受信および再生を自社で管理できます。
その後、取得した音声データを再生デバイスに渡して処理および再生を行ってください。
サンプルコード
Android: Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/CustomAudioCaptureAndRender/CustomAudioRenderActivity.java。
iOS: iOS/ARTCExample/AdvancedUsage/CustomAudioRender/CustomAudioRenderVC.swift。
前提条件
カスタム音声再生を利用する前に、以下の要件を満たしていることを確認してください。
完全な音声再生モジュールを開発できるか、または既に確立されたサードパーティ製または社内開発の音声プレーヤーをお持ちであることです。
PCM データ形式、サンプルレート、チャンネル数などの概念を含む基本的な音声処理ワークフローを理解していることです。
ARTC SDK を統合済みであり、基本的な音声・映像通話機能を実装済みであることです。
ご利用のユースケースにおいて、ARTC の内部再生モジュールをバイパスする必要があることです。該当しない場合は、安定性および互換性を確保するため、デフォルトの再生ソリューションをご利用ください。
実装
実装
1. 内部再生の無効化
カスタム音声再生機能を利用するには、通常、SDK の内部再生を無効化する必要があります。エンジンインスタンスの作成時に getInstance を呼び出し、extras パラメーターを渡すことで、この設定を推奨します。関連するパラメーターは以下のとおりです。
user_specified_use_external_audio_player: 外部プレーヤーを使用するかどうかを指定します。
"TRUE": 外部プレーヤーを使用し、内部再生を無効化します。"FALSE": デフォルトの内部再生を使用します。
Android
String extras = "{\"user_specified_use_external_audio_player\":\"TRUE\"}";
mAliRtcEngine = AliRtcEngine.getInstance(this, extras);iOS
// エンジンの作成および初期化。
var customAudioPlayConfig: [String: String] = [:]
// 外部プレーヤーを使用し、SDK の内部再生を無効化します。
customAudioPlayConfig["user_specified_use_external_audio_player"] = "TRUE"
// JSON シリアル化。
guard let jsonData = try? JSONSerialization.data(withJSONObject: customAudioPlayConfig, options: []),
let extras = String(data: jsonData, encoding: .utf8) else {
print("JSON シリアル化に失敗しました")
return
}
let engine = AliRtcEngine.sharedInstance(self, extras:extras)Mac
NSString * extras = @"{\"user_specified_use_external_audio_player\":\"TRUE\"}";
self.engine = [AliRtcEngine sharedInstance:self extras:extras];Windows
std::string extras = "{\"user_specified_use_external_audio_player\":\"TRUE\"}";
mAliRtcEngine = AliRtcEngine.getInstance(this, extras.c_str());2. 音声フレームコールバックの登録
enableAudioFrameObserver を呼び出して音声フレームコールバックを登録します。以下のパラメーターを渡します。
enable: データコールバックを有効または無効にするブール値です。audioSource: コールバックのデータソースの種別です。カスタム音声再生では、AliRtcAudioSourcePlaybackを指定して、onPlaybackAudioFrameコールバックを通じて再生ステージからのデータを受信します。config: コールバックで使用する音声パラメーター(サンプルレートおよびチャンネル数など)です。
Android
// コールバック構成を設定します。
AliRtcEngine.AliRtcAudioFrameObserverConfig config = new AliRtcEngine.AliRtcAudioFrameObserverConfig();
config.sampleRate = AliRtcAudioSampleRate_48000;
config.channels = 1;
// 再生データコールバックを有効化するために登録します。
mAliRtcEngine.enableAudioFrameObserver(true, AliRtcAudioSourcePlayback, config);iOS
// コールバック構成を設定します。
var observerConfig: AliRtcAudioFrameObserverConfig = AliRtcAudioFrameObserverConfig()
observerConfig.sampleRate = ._Unknown
observerConfig.channels = .monoAudio
// 再生データコールバックを有効化するために登録します。
let audioSource: AliRtcAudioSource = .playback
engine.enableAudioFrameObserver(true, audioSource: audioSource, config: observerConfig)Mac
AliRtcAudioFrameObserverConfig* config = [[AliRtcAudioFrameObserverConfig alloc] init];
config.channels = audioNumChannel;
config.sampleRate = AliRtcAudioSampleRate_48000;
config.mode = AliRtcAudioFrameObserverOperationModeReadOnly;
[self.engine enableAudioFrameObserver:TRUE audioSource:AliRtcAudioSourcePlayback config:config];Windows
// コールバック構成を設定します。
AliEngineAudioFrameObserverConfig config ;
config.sampleRate = AliRtcAudioSampleRate_48000;
config.channels = AliEngineMonoAudio;
// 再生データコールバックを有効化するために登録します。
mAliRtcEngine->EnableAudioFrameObserver(true, AliEngineAudioSourcePlayback, config);3. コールバック内の PCM データの処理
コールバック内で受信した PCM データを処理し、再生デバイスに送信します。
Android
@Override
public boolean onPlaybackAudioFrame(AliRtcEngine.AliRtcAudioFrame frame) {
// コールバックで受信した音声データを再生するためのカスタム処理を実装します。
return true;
}iOS
func onPlaybackAudioFrame(_ frame: AliRtcAudioFrame) -> Bool {
// コールバックで受信した音声データを再生するためのカスタム処理を実装します。
return true
}Mac
- (BOOL)onPlaybackAudioFrame:(AliRtcAudioFrame* _Nonnull)frame {
// コールバックで受信した音声データを再生するためのカスタム処理を実装します。
return true;
}Windows
bool CTutorialDlg::OnPlaybackAudioFrame(AliEngineAudioRawData audioRawData) {
// コールバックで受信した音声データを再生するためのカスタム処理を実装します。
return true;
}4. オブザーバーを無効化する
Android
mAliRtcEngine.enableAudioFrameObserver(false, AliRtcAudioSourcePlayback, config)iOS
engine.enableAudioFrameObserver(false, audioSource: audioSource, config: observerConfig)Mac
[self.engine enableAudioFrameObserver:false audioSource:AliRtcAudioSourcePlayback config:config];Windows
mAliRtcEngine->EnableAudioFrameObserver(false, AliEngineAudioSourcePlayback, config);5. (任意)内部再生の動的有効化/無効化
通話中に SDK の内部再生を動的に有効化または無効化するには、setParameter メソッドを呼び出します。
Android
/* 内部再生を動的に無効化 */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine.setParameter(parameter);
/* 内部再生を動的に有効化 */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}";
mAliRtcEngine.setParameter(parameter);iOS
// 内部再生を動的に無効化。
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}")
// 内部再生を動的に有効化。
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}")Mac
// 内部再生を動的に無効化。
[self.engine setParameter:"{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}"];
// 内部再生を動的に有効化。
[self.engine setParameter:"{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}"];Windows
/* 内部再生を動的に無効化 */
std::string parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine->SetParameter(parameter.c_str());
/* 内部再生を動的に有効化 */
std::string parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}";
mAliRtcEngine->SetParameter(parameter.c_str());