すべてのプロダクト
Search
ドキュメントセンター

:Android

最終更新日:Jun 22, 2026

このトピックでは、Android で ApsaraVideo Player SDK と Native RTS SDK を統合してRTS (リアルタイムストリーミング) を有効にする方法について説明します。

SDK 統合

次のいずれかの方法を使用して、ApsaraVideo Player SDK と Native RTS SDK の依存関係を追加します。

  • 方法1:Maven 統合

    1. プロジェクトの app/build.gradle ファイルに、ApsaraVideo Player SDK と Native RTS SDK の依存関係を追加します。

      implementation 'com.aliyun.sdk.android:AlivcArtc:5.4.4.0'
      implementation 'com.aliyun.rts.android:RtsSDK:2.1.0'
      implementation 'com.aliyun.sdk.android:AliyunPlayer:5.4.4.0-full'
      説明
      • AlivcArtcRtsSDK の依存関係を追加すると、ApsaraVideo Player SDK は RTS SDK をプラグインとして自動的にロードします。

      • ここに記載されている Maven の依存関係のバージョンは参考用です。ApsaraVideo Player SDK の最新バージョンについては、「Android SDK リリース履歴」をご参照ください。RTS SDK の最新バージョンについては、「Android で RTS ストリーミング」をご参照ください。

      • ApsaraVideo Player SDK と Native RTS SDK のバージョンに互換性があることを確認してください。詳細については、「SDK バージョンの互換性」をご参照ください。

    2. Maven リポジトリの URL を追加します。

      これらの URL をプロジェクトのルートディレクトリにある build.gradle ファイルに追加します。

      // MPChart の Maven リポジトリ。チャートが不要な場合は削除できます。
      maven { url 'https://jitpack.io' }
      // Alibaba Cloud SDK (ApsaraVideo Player SDK, RTS SDK) の Maven リポジトリ。
      maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases' }
  • 方法2:AAR の手動統合

    1. 必須の .aar ファイルを app/libs ディレクトリにコピーします。aar文件

    2. app/build.gradle ファイルに、次のコードを追加します。

      dependencies{
          implementation fileTree(dir: 'libs', include: ['*.aar'])
      }

SDK API の使用

ApsaraVideo Player SDK API を呼び出して RTS 機能を使用します。ApsaraVideo Player SDK のその他の機能の詳細については、「高度な機能」および「API リファレンス」をご参照ください。

説明
  • 以下のコードスニペットはデモ用です。完全なソースコードについては、オープンソースプロジェクトをご参照ください。

  • ApsaraVideo Player SDK で RTS ストリームを再生する場合、pause() メソッドを呼び出してライブストリームを一時停止することはできません。代わりに、stop() を呼び出して再生を停止し、その後 prepare() を呼び出して再開する必要があります。

  • seek 操作はサポートされていません。

  • ライブラリのロード

    適切な Activity に System.loadLibrary("RtsSDK"); を追加します。

    static {
        System.loadLibrary("RtsSDK");
    }
  • プレーヤーの作成

    AliPlayerFactory クラスは、AliPlayerAliListPlayer の2種類のプレーヤーを提供します。単一のメディアソースを再生するには、AliPlayer を使用します。次のコードは、AliPlayer インスタンスを作成する方法を示しています。

    AliPlayer aliyunVodPlayer;
    .....
    aliyunVodPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext());
  • プレーヤーリスナーの設定

    プレーヤーは、onPreparedonCompletion などのイベントを処理するためのさまざまなリスナーを提供します。次のコードは、これらのリスナーを設定する方法を示しています。

    aliyunVodPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            // エラー発生時に呼び出されます。
        }
    });
    aliyunVodPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // プレーヤーの準備が完了したときに呼び出されます。
        }
    });
    aliyunVodPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // ビデオの解像度が変更されたときに呼び出されます。
        }
    });
    aliyunVodPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            // 最初のフレームがレンダリングされたときに呼び出されます。
        }
    });
    aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            // ループ開始、バッファリングの進行状況、現在の位置などの再生情報イベントで呼び出されます。
        }
    });
    aliyunVodPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            // バッファリング開始時に呼び出されます。
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            // バッファリングの進行状況。
        }
        @Override
        public void onLoadingEnd() {
            // バッファリング終了時に呼び出されます。
        }
    });
    aliyunVodPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            // 字幕が表示されたときに呼び出されます。
        }
        @Override
        public void onSubtitleHide(long id) {
            // 字幕が非表示になったときに呼び出されます。
        }
    });
    aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            // トラックまたは解像度の切り替えに成功したときに呼び出されます。
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            // トラックまたは解像度の切り替えに失敗したときに呼び出されます。
        }
    });
    aliyunVodPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            // プレーヤーの状態が変化したときに呼び出されます。
        }
    });
    aliyunVodPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            // スナップショットがキャプチャされたときに呼び出されます。
        }
    });
  • データソースの作成

    プレーヤーは、VidStsVidAuthVidMpsUrlSource の4種類の再生ソースをサポートしています。URL 直接再生で RTS 機能を使用するには、UrlSource を使用する際に URL で artc:// プロトコルを使用する必要があります。

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("artc://<your_streaming_url>");
    aliyunVodPlayer.setDataSource(urlSource);</your_streaming_url>
  • 表示ビューの設定

    再生ソースにビデオが含まれている場合、ビデオフレームをレンダリングするために表示ビューを設定する必要があります。SurfaceViewTextureView の両方がサポートされています。次の例では SurfaceView を使用しています。

    surfaceView = (SurfaceView) findViewById(R.id.playview);
    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            aliyunVodPlayer.setDisplay(holder);
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            aliyunVodPlayer.surfaceChanged();
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            aliyunVodPlayer.setDisplay(null);
        }
    });
  • 再生コントロール

    再生コントロール用の独自の UI を作成し、ボタンのイベントハンドラで対応するプレーヤーメソッドを呼び出す必要があります。次の例は、再生や停止などの基本的なコントロール操作を示しています。

    // プレーヤーを準備します。onPrepared コールバックで start() を呼び出して再生を開始します。
    aliyunVodPlayer.prepare();
    // 再生を開始します。
    aliyunVodPlayer.start();
    // 再生を停止します。
    aliyunVodPlayer.stop();
    // プレーヤーをリセットします。
    aliyunVodPlayer.reset();
    // プレーヤーを解放します。一度解放すると、プレーヤーインスタンスは再利用できません。
    aliyunVodPlayer.release();
  • 再生パラメーターの設定

    再生パラメーターを設定して、RTS のパフォーマンスを最適化します。

    // 現在の設定を取得します。
    PlayerConfig config = mAliyunVodPlayer.getConfig();
    // 最大レイテンシーを 1,000 ms に設定します。レイテンシーは ARTC プロトコルによって管理されます。
    config.mMaxDelayTime = 1000;
    // 開始バッファーと高バッファーの持続時間を 10 ms に設定します。バッファリングは ARTC プロトコルによって管理されます。
    config.mHighBufferDuration = 10;
    config.mStartBufferDuration = 10;
    ....// その他の設定
    // 設定をプレーヤーに適用します。
    mAliyunVodPlayer.setConfig(config);
  • ログ記録

    // ログ記録を有効にします
    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);
  • ライブストリームのデグレード

    ライブストリームのデグレードは、再生 URL の artc:// プレフィックスを HTTP-FLV URL に変更するフォールバック戦略です。その後、プレーヤーの UrlSource を更新して再生を再開できます。

    /**
     * デグレード戦略
     */
    private void willBeDemoted() {
        mRtsAliPlayer.stop();
        if (mUrl.startsWith("artc://")) {
            setDataSource("http://xxxx.flv");
            mRtsAliPlayer.prepare();
        }
    }
  • TraceId の取得

    onInfo コールバックの InfoCode.DirectComponentMSG イベントは、基盤となる RTS コンポーネントからのパススルーメッセージを示します。TraceId を取得するには、このイベントの extraMsg 文字列を解析します。メッセージに code=104 (トレース ID イベント) が含まれている場合、-sub- デリミタに続く部分文字列を解析することで TraceId を抽出できます。

    private static final int TRACE_ID_CODE = 104;
    
    // プレーヤーの onInfo コールバックをリッスンし、RTS イベントメッセージを解析します。
    mRtsAliPlayer.setOnInfoListener(infoBean -> {
        if (infoBean.getCode() == InfoCode.DirectComponentMSG) {
            String extraMsg = infoBean.getExtraMsg();
            parseDirectComponentMSG(extraMsg);
        }
    });
    
    private void parseDirectComponentMSG(String msg) {
        if (msg.contains("code=" + TRACE_ID_CODE)) {
            parseTraceId(msg);
        }
    }
    
    /**
     * TraceId を解析します。
     */
    private void parseTraceId(String msg) {
        String[] split = msg.split("-sub-");
        if (split.length >= 1) {
            mTraceId = "RequestId:" + (split[1].substring(0, split[1].length() - 1));
            mTraceId = mTraceId.replace("\"", "").replace("\\", "");
        }
    }