このトピックでは、Android 向け ApsaraVideo Player SDK を使用して RTS(リアルタイムストリーミング)を実装する方法について説明します。
SDK の統合
ApsaraVideo Player SDK の依存ファイルを以下のように追加します。
Maven 統合
Maven リポジトリのアドレスを追加します。
ルートディレクトリの build.gradle ファイルに Maven リポジトリのアドレスを追加します。
// Alibaba Cloud 関連 SDK(ApsaraVideo Player)用の Maven リポジトリアドレス maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }プロジェクト内の app/build.gradle ファイルに ApsaraVideo Player SDK の依存ファイルを追加します。
def player_sdk_version = "x.x.x" // 最新バージョンの使用を推奨します。 def rts_sdk_version = "7.12.0" // 独自のバージョン番号。現在の最新バージョンです。 // プレーヤーのメインライブラリ implementation "com.aliyun.sdk.android:AliyunPlayer:$player_sdk_version-full" // プレーヤーと RTS コンポーネント間のブリッジレイヤー(AlivcArtc)。プレーヤーのバージョン番号と一致させる必要があり、RTS コンポーネントと同時に統合する必要があります。 implementation "com.aliyun.sdk.android:AlivcArtc:$player_sdk_version" // RTS コンポーネント implementation "com.aliyun.rts.android:RtsSDK:$rts_sdk_version"重要プレーヤーと RTS コンポーネント間のブリッジレイヤー(AlivcArtc)は、プレーヤーのバージョン番号と一致させる必要があり、RTS コンポーネントと同時に統合する必要があります。
プレーヤーのバージョンについては、「SDK ダウンロード」をご参照ください。最新バージョンの使用を推奨します。サポートされる最小バージョンは V5.4.5.0 です。
よくある質問については、「Android プレーヤーよくある質問」をご参照ください。
ApsaraVideo Player SDK インターフェイスの使用
ApsaraVideo Player SDK が提供するメソッドを呼び出して RTS 機能を使用します。ApsaraVideo Player SDK のその他の機能については、「高度な機能」および「API リファレンス」をご参照ください。
以下はサンプルコードです。詳細なコードについては、API-Example プロジェクト内の RTS リアルタイムストリーミング再生 モジュールをご参照ください。このプロジェクトは Java ベースの ApsaraVideo Player SDK Android サンプルプロジェクトであり、開発者が SDK のコア機能を迅速に習得できるように支援します。
ApsaraVideo Player SDK を使用して RTS ストリームフェッチングを実装する場合、ライブストリームを一時停止するために pause メソッドを呼び出すことはできません。代わりに stop を呼び出して再生を停止し、その後 prepare を呼び出して再び再生を開始してください。
シーク(ドラッグ)はサポートされていません。
RTS ライブラリの読み込み
必要に応じて、適切な Activity に System.loadLibrary("RtsSDK"); を追加します。
static {
System.loadLibrary("RtsSDK");
}プレーヤーの作成
プレーヤーを作成します。
AliPlayerFactoryクラスを使用して AliPlayer を作成できます。// プレーヤーインスタンスの作成 AliPlayer mAliPlayer = AliPlayerFactory.createAliPlayer(context); // traceId を渡します // 任意:「プレーヤー単一点トレース」機能の使用を推奨します。ApsaraVideo Player SDK を使用した動画再生中に例外が発生した場合、単一点トレース機能を使用して特定のユーザーまたは再生セッションにおける異常な再生動作をフルリンクでトレースできます。これにより、問題の原因を迅速に診断し、再生体験の管理効率を効果的に向上させることができます。 // traceId の値はご自身で定義してください。これはユーザーまたはユーザーデバイスの一意な識別子(例:ビジネス上のユーザー ID、IMEI、IDFA など)である必要があります。 mAliPlayer.setTraceId("traceId");説明プレーヤーは、再生品質モニタリング機能 (全体的な再生品質に関するデータを表示するため)、単一ポイントのトラブルシューティング機能 (特定のユーザーまたはデバイスを特定し、その再生動作を分析して、再生の異常を迅速に特定するため)、およびビデオ再生統計機能を提供しており、これらの機能はすべてイベントトラッキングログレポート機能に依存しています。
プレーヤー作成時に利用可能な機能は、
setTraceIdパラメーターの設定によって次のように決定されます。setTraceIdパラメーターを渡さない場合(デフォルト):イベントトラッキングログレポート機能が有効になります。これにより、再生品質モニタリングおよび動画再生統計機能を使用できますが、単一点トレース機能は利用できません。setTraceIdパラメーターに trace ID を渡す場合、trace ID の値はご自身で定義してください。これはユーザーまたはユーザーデバイスの一意な識別子(例:ビジネス上のユーザー ID、IMEI、IDFA など)である必要があります。trace ID を渡すと、イベントトラッキングログレポート機能が有効になり、再生品質モニタリング、単一点トレース、および動画再生統計の各機能を使用できます。setTraceIdパラメーターをDisableAnalyticsに設定すると、イベントトラッキングログレポート機能が無効になります。これにより、再生品質モニタリング、単一点トレース、および動画再生統計の各機能は使用できません。
表示ビューを設定します。
プレーヤーは AliDisplayView(推奨)、SurfaceView、TextureView をサポートしています。必要に応じて選択してください。
XML ファイルでビューを宣言します。
AliDisplayView(推奨)
<!-- プレーヤーレンダリングビュー --> <com.aliyun.player.videoview.AliDisplayView android:id="@+id/ali_display_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" />SurfaceView
<!-- プレーヤーレンダリングビュー --> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" />TextureView
<!-- プレーヤーレンダリングビュー --> <TextureView android:id="@+id/texture_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" />表示ビューを設定します。
AliDisplayView(推奨)
プレーヤーの
setDisplayViewインターフェイスを呼び出してプレーヤービューをバインドします。AliDisplayView mAliDisplayView = findViewById(R.id.display_view); // setPreferDisplayView() を使用して再生ビューの種類を設定します mAliDisplayView.setPreferDisplayView(AliDisplayView.DisplayViewType.SurfaceView); mAliPlayer.setDisplayView(mAliDisplayView);SurfaceView
プレーヤーの
setSurfaceインターフェイスを呼び出してプレーヤービューをバインドします。SurfaceView mSurfaceView = findViewById(R.id.surface_view); mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { mAliPlayer.setSurface(holder.getSurface()); } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { mAliPlayer.surfaceChanged(); } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { mAliPlayer.setSurface(null) } });TextureView
プレーヤーの
setSurfaceインターフェイスを呼び出してプレーヤービューをバインドします。TextureView mTextureView = findViewById(R.id.texture_view); mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { mAliPlayer.setSurface(new Surface(surface)); } @Override public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) { mAliPlayer.surfaceChanged(); } @Override public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) { mAliPlayer.setSurface(null); return true; } @Override public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) { } });
再生ソースを設定します。
プレーヤーは VidSts、VidAuth、VidMps、UrlSource の 4 種類の再生ソースをサポートしています。UrlSource は直接 URL 再生用です。
artc://プロトコルの URL を設定することで RTS サービスを使用できます。UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://<Streaming URL>"); mAliPlayer.setDataSource(urlSource);説明再生ソースの設定方法の詳細については、「基本機能」をご参照ください。
再生パラメーターを構成します。
再生パラメーターを構成して RTS のパフォーマンスを向上させます。
説明ApsaraVideo Player SDK V6.3.0 以降では、最適な低遅延構成が自動で適用されます。再生 URL が "artc://" で始まり、かつ
PlayerConfig内のmMaxDelayTime、mHighBufferDuration、およびmStartBufferDurationの値を手動で変更していない場合、SDK は実際の再生時にそれぞれ 1000、10、10 を自動的に使用します。カスタム制御を行う場合は、以下の例を参照してください。
// 1. 構成を取得して変更します PlayerConfig config = mAliPlayer.getConfig(); if (playUrl.startWith("artc://")) { // 最大遅延時間:1000 ミリ秒 config.mMaxDelayTime = 1000; // 再生開始時のバッファ時間:10 ミリ秒 config.mStartBufferDuration = 10; // カクつきからの回復時のバッファ時間:10 ミリ秒 config.mHighBufferDuration = 10; } else { // デフォルト構成を使用するか、他の構成にカスタマイズします } // 2. 構成を適用します mAliPlayer.setConfig(config);再生を開始します。
// 再生の準備 mAliPlayer.prepare(); // 再生の開始 mAliPlayer.start();
再生の制御
Android 向け ApsaraVideo Player SDK では、特定の時点からの再生、再生の開始、再生の停止などの操作がサポートされています。
再生を開始します。
これは動画再生を開始することを指し、
startインターフェイスによって実装されます。例:mAliPlayer.start();再生を停止します。
これは動画再生を停止することを指し、
stopインターフェイスによって実装されます。例:mAliPlayer.stop();プレーヤーを破棄します。
プレーヤーインスタンスを同期または非同期のいずれかの方法で破棄します。例:
// 同期破棄。内部で stop インターフェイスが自動的に呼び出されます。 mAliPlayer.release(); // 非同期破棄。内部で stop インターフェイスが自動的に呼び出されます。 mAliPlayer.releaseAsync();説明同期破棄メソッドは、プレーヤーリソースが完全に解放された後にのみ戻ります。UI 応答速度に高い要件がある場合は、非同期破棄メソッドを使用し、以下の点に注意してください。
非同期破棄中にプレーヤーオブジェクトに対して他の操作を行わないでください。
非同期破棄メソッドを呼び出す前に、プレーヤーを手動で停止する必要はありません。このプロセスには内部的に非同期停止フローが含まれているためです。
補助機能
ログスイッチ
// ログを有効化 Logger.getInstance(context).enableConsoleLog(true); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_TRACE); // ログを無効化 Logger.getInstance(context).enableConsoleLog(false); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_NONE);ライブ RTS の劣化。
説明再生失敗時のスペックダウンは、タイムアウトシナリオにのみ適用されます。再生タイムアウトシナリオにおいて以下のスペックダウンスキームのいずれかが構成されている場合、スペックダウン再生処理が実行されます。それ以外の場合は、プレーヤーの onError コールバックがトリガーされます。たとえば、404 や 403、ストリーマーの切断などの例外はスペックダウンをトリガーしません。
RTS 自動スペックダウン は、同一ドメイン名を使用して RTS から FLV へのスペックダウンを実現します。RTS と FLV のドメイン名が異なる場合は、RTS カスタムスペックダウン スキームを構成して、対象となる FLV ドメイン名を指定してください。
RTS 自動スペックダウン(デフォルトで有効)
リアルタイムストリーミング(RTS)アドレスを使用した再生シナリオにおいて、RTS カスタムスペックダウンが構成されておらず、かつ RTS ストリームフェッチングが失敗した場合、システムは自動的に RTS に対応するデフォルトの FLV アドレスにスペックダウンして再生を行います。例:
// 1 は有効、0 は無効を意味します。デフォルトで有効です。 AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);RTS カスタム デグラデーション
リアルタイムストリーミング(RTS)アドレスを使用した再生シナリオにおいて、RTS スペックダウンアドレス(HLS または FLV アドレスなど)を設定することで、RTS ストリームフェッチングが失敗した場合にシステムが自動的にそのアドレスにスペックダウンして再生を行います。例:
PlayerConfig config = mAliPlayer.getConfig(); // 任意:config 内の他の項目を構成します UrlSource urlSource = new UrlSource(); urlSource.setUri(downgradeUrl); // スペックダウン URL を設定します mAliPlayer.enableDowngrade(urlSource, config);
TraceID の取得
各低遅延再生にはトラブルシューティング用の traceId が付与されます。プレーヤーのイベントコールバックを通じて traceId を取得できます。
// プレーヤーの onInfo コールバックをリッスンし、DemuxerTraceID メッセージを解析します mAliPlayer.setOnInfoListener(infoBean -> { if (infoBean.getCode() == InfoCode.DemuxerTraceID) { String traceId = infoBean.getExtraMsg(); });