このトピックでは、ApsaraVideo Player SDK for Android を使用して 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.10.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 です。V7.5.0 以降の使用を推奨します。
詳細については、「ApsaraVideo Player for Android のよくある質問」をご参照ください。
ApsaraVideo Player SDK API の使用
ApsaraVideo Player SDK API を呼び出して、RTS 機能を実装します。ApsaraVideo Player SDK の他の機能の詳細については、「高度な機能」および「API リファレンス」をご参照ください。
次のコードは一例です。詳細なコードについては、API-Example プロジェクトの RTS 再生モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、開発者が SDK のコア機能を迅速に統合する方法を学ぶのに役立ちます。
ApsaraVideo Player を使用して RTS ストリームフェッチングを行う場合、`pause` メソッドを呼び出してライブストリームを一時停止しないでください。代わりに、`stop` メソッドを呼び出して再生を停止し、その後 `prepare` メソッドを呼び出して再開します。
シーク (ドラッグ) 操作はサポートされていません。
RTS ライブラリのロード
適切なアクティビティに System.loadLibrary("RtsSDK"); を追加します。
static {
System.loadLibrary("RtsSDK");
}プレーヤーの作成
プレーヤーを作成します。
AliPlayerFactoryクラスを使用して AliPlayer インスタンスを作成します。// プレーヤーインスタンスを作成します。 AliPlayer mAliPlayer = AliPlayerFactory.createAliPlayer(context); // traceId を渡します。 // オプション:トレース分析機能を使用します。ApsaraVideo Player SDK での動画再生中に例外が発生した場合、この機能を使用して特定のユーザーまたは再生セッションのエンドツーエンドのトレースを実行できます。これにより、問題を迅速に診断し、再生体験を向上させることができます。 // traceId の値はユーザー定義です。ビジネスの userid や、国際移動体装置識別番号 (IMEI) や広告主識別子 (IDFA) などのデバイス ID のように、ユーザーまたはそのデバイスの一意の識別子である必要があります。 mAliPlayer.setTraceId("traceId");説明プレーヤーが提供する再生品質モニタリング、トレース分析、および動画再生統計機能は、イベントトラッキングログレポート機能に依存します。
プレーヤーを作成する際、利用可能な機能は
setTraceIdパラメーターの設定方法によって異なります。setTraceIdパラメーターが渡されない (デフォルト):イベントトラッキングログレポート機能が有効になります。再生品質モニタリングと動画再生統計機能は使用できますが、トレース分析機能は使用できません。setTraceIdパラメーターに traceid が渡される:traceid の値はユーザー定義です。ビジネスのユーザー ID や、IMEI や IDFA などのデバイス ID のように、ユーザーまたはそのデバイスの一意の識別子である必要があります。traceid を渡すと、イベントトラッキングログレポート機能が有効になります。その後、再生品質モニタリング、トレース分析、および動画再生統計機能を使用できます。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 から直接動画を再生できます。RTS サービスを使用するには、URL プロトコルを
artc://に設定します。UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://<ストリーミング 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 ms です。 config.mMaxDelayTime = 1000; // 再生開始時のバッファー時間は 10 ms です。 config.mStartBufferDuration = 10; // 再生停止からの回復のためのバッファー時間は 10 ms です。 config.mHighBufferDuration = 10; } else { // config にはデフォルトの構成を使用するか、カスタマイズします。 } // 2. 構成を適用します。 mAliPlayer.setConfig(config);再生を開始します。
// 再生を準備します。 mAliPlayer.prepare(); // 再生を開始します。 mAliPlayer.start();
再生のコントロール
ApsaraVideo Player SDK for Android は、再生の開始や停止などの操作をサポートしています。
再生を開始します。
動画の再生を開始するには、
startメソッドを使用します。次のコードは一例です。mAliPlayer.start();再生を停止します。
動画の再生を停止するには、
stopメソッドを使用します。次のコードは一例です。mAliPlayer.stop();プレーヤーを破棄します。
プレーヤーインスタンスを破棄するには、同期モードまたは非同期モードを使用できます。次のコードは一例です。
// 同期破棄。stop メソッドは内部で自動的に呼び出されます。 mAliPlayer.release(); // 非同期破棄。stop メソッドは内部で自動的に呼び出されます。 mAliPlayer.releaseAsync();説明同期破棄メソッドは、すべてのプレーヤーリソースが解放された後にのみ値を返します。ご利用のインターフェイスが高い応答性を必要とする場合は、非同期破棄メソッドを使用し、次の点に注意してください。
非同期破棄中は、プレーヤーオブジェクトに対して他の操作を実行しないでください。
非同期破棄メソッドを呼び出す前にプレーヤーを手動で停止する必要はありません。このプロセスには非同期停止プロシージャが含まれているためです。
補助機能
ロギングを有効または無効にします。
// ロギングを有効にします。 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 URL から動画を再生する際、カスタム RTS フォールバックが設定されておらず、RTS ストリームフェッチングが失敗した場合、プレーヤーは RTS URL に対応するデフォルトの FLV URL に自動的にフォールバックします。次のコードは一例です。
// 1 は有効、0 は無効を示します。この機能はデフォルトで有効です。 AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.ALLOW_RTS_DEGRADE, 1);カスタム RTS フォールバック
RTS URL から動画を再生する際、HLS や FLV の URL などのフォールバック URL を設定できます。RTS ストリームフェッチングが失敗した場合、プレーヤーは自動的に指定された URL にフォールバックして再生します。次のコードは一例です。
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(); });