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

ApsaraVideo VOD:高度な機能

最終更新日:Mar 13, 2026

このトピックでは、ApsaraVideo Player SDK for Android の高度な機能について説明し、サンプルコードを提供します。その他の機能の詳細については、「ApsaraVideo Player SDK for Android の API オペレーション」をご参照ください。

重要

デモを実行してテストするには、それをダウンロードし、デモの実行に記載の手順に従ってコンパイルおよび実行してください。

専門能力を確認する

説明

一部のプレーヤー機能には、Professional Edition のライセンスが必要です。詳細については、「ApsaraVideo Player SDK の機能概要」をご参照ください。これらの機能を使用するには、「Player SDK ライセンスの取得」の説明に従ってライセンスを取得してください。

アプリの起動時またはプレーヤーインターフェイスを呼び出す前に、リスナーを設定します。

import com.aliyun.private_service.PrivateService;


PrivateService.setOnPremiumLicenseVerifyCallback(new PrivateService.OnPremiumLicenseVerifyCallback() {
    @Override
    public void onPremiumLicenseVerifyCallback(PrivateService.PremiumBizType type, boolean isValid, String errorMsg) {
        Log.d(TAG, "onPremiumLicenseVerifyCallback: " + type + " isValid: " + isValid + " errorMsg: " + errorMsg);
    }
});

このコードでは、PremiumBizType はプロフェッショナル機能を表す列挙です。プレーヤーはこれらの機能を検証し、関連機能を使用する際にこのコールバックを通じて結果を返します。isValid が false の場合、errorMsg には具体的な理由が含まれます。

再生

リスト再生

ApsaraVideo Player SDK for Android は、動画の本格的なリスト再生機能を提供します。SDK はプリロードなどの技術を活用して、ショートビデオの読み込み時間を最小限に抑えます。

操作手順

  1. プレーヤーの作成

    AliPlayerFactory クラスを使用して AliListPlayer インスタンスを作成します。サンプルコード:

    AliListPlayer aliListPlayer;
    .....
    aliListPlayer = AliPlayerFactory.createAliListPlayer(getApplicationContext());
    aliListPlayer.setTraceId("traceId");  // トレース ID は、デバイスまたはユーザーの一意の識別子です。ほとんどの場合、値はデバイスの IMEI (国際移動体装置識別番号) または IDFA (広告識別子) です。

  2. オプション。 リスナーの設定

    ショートビデオのリストプレーヤーを作成する際、リスナーはオプションです。ただし、リスナーを設定しない場合、再生失敗や進捗など、プレーヤーに関連するイベントの通知を受け取ることができません。次のリスナーを設定することを推奨します:OnPreparedListenerOnErrorListenerOnCompletionListenerOnLoadingStatusListener、および OnInfoListener

    コードの表示

    aliListPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
        @Override
        public void onCompletion() {
            // 再生終了のリスナー。
        }
    });
    aliListPlayer.setOnErrorListener(new IPlayer.OnErrorListener() {
        @Override
        public void onError(ErrorInfo errorInfo) {
            // エラー発生のリスナー。
        }
    });
    aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // 準備完了のリスナー。
        }
    });
    aliListPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // 動画解像度の変更のリスナー。
        }
    });
    aliListPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() {
        @Override
        public void onRenderingStart() {
            // 最初のフレーム表示のリスナー。
        }
    });
    aliListPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
        @Override
        public void onInfo(int type, long extra) {
            // その他のイベントのリスナー。type パラメーターには、ループ再生の開始、バッファ位置、現在の再生位置、自動再生の開始など、さまざまなイベントを示す複数の値が含まれます。
        }
    });
    aliListPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() {
        @Override
        public void onLoadingBegin() {
            // バッファリング開始のリスナー。 
        }
        @Override
        public void onLoadingProgress(int percent, float kbps) {
            // バッファリング進捗のリスナー。
        }
        @Override
        public void onLoadingEnd() {
            // バッファリング終了のリスナー。
        }
    });
    aliListPlayer.setOnSeekCompleteListener(new IPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete() {
            // シーク終了のリスナー。
        }
    });
    aliListPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
        @Override
        public void onSubtitleShow(long id, String data) {
            // 字幕表示のリスナー。
        }
        @Override
        public void onSubtitleHide(long id) {
            // 字幕非表示のリスナー。
        }
    });
    aliListPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
        @Override
        public void onChangedSuccess(TrackInfo trackInfo) {
            // 音声ストリームとビデオストリーム、または解像度の切り替え成功のリスナー。
        }
        @Override
        public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
            // 音声ストリームとビデオストリーム、または解像度の切り替え失敗のリスナー。
        }
    });
    aliListPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() {
        @Override
        public void onStateChanged(int newState) {
            // プレーヤーのステータス変更のリスナー。
        }
    });
    aliListPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() {
        @Override
        public void onSnapShot(Bitmap bm, int with, int height) {
            // スナップショットキャプチャのリスナー。
        }
    });
  3. プリロードする動画の数を指定

    必要に応じてプリロードする動画の数を設定し、起動時の読み込み時間を短縮できます。サンプルコード:

    // プリロードする動画の数を指定します。ロードされる動画の総数は、指定した数の 2 倍に 1 を加えたものになります。 
    aliListPlayer.setPreloadCount(int count);
  4. 複数の再生ソースの追加または削除

    リスト再生は、Vid と UrlSource に基づく動画再生をサポートしています。VidSts または VidPlayAuth を使用して Vid に基づいて動画を再生できます。Url は動画の再生 URL です。サンプルコード:

    • Url:再生 URL は、ApsaraVideo VOD またはサードパーティのビデオオンデマンド (VOD) プラットフォーム上の音声または動画ファイルの URL にすることができます。GetPlayInfo オペレーションを呼び出して、ApsaraVideo VOD 内の音声または動画ファイルの再生 URL を取得できます。複雑な署名計算を避けるために、ApsaraVideo VOD SDK を使用してこのオペレーションを呼び出すことを推奨します。GetPlayInfo オペレーションの詳細については、OpenAPI Explorer をご参照ください。

    • Vid:音声または動画 ID。ID を取得するには、ApsaraVideo VOD コンソールにログインし、左側のナビゲーションウィンドウで [メディアファイル] > [オーディオ/ビデオ] を選択します。または、SearchMedia オペレーションを呼び出すこともできます。

    // Vid 再生ソースを追加します。
    aliListPlayer.addVid(String videoId, String uid);
    // UrlSource 再生ソースを追加します。
    aliListPlayer.addUrl(String url, String uid);
    // 再生ソースを削除します。
    aliListPlayer.removeSource(String uid);
    説明

    uid パラメーターは、動画の一意の ID を示します。この一意の ID を使用して動画を識別できます。同じ一意の ID を持つ動画は同一と見なされます。プレーヤーが指定していない動画を再生する場合、複数の動画に同じ ID を割り当てていないか確認してください。一意の ID は、任意の文字列に設定できます。

  5. ビューの設定

    SurfaceView と TextureView がサポートされています。UI ビューを SurfaceView または TextureView に設定します。

    • 次のサンプルコードは、SurfaceView を使用してビューを設定する方法を示しています。

      コードの表示

      SurfaceView surfaceView = findViewById(R.id.surface_view);
      surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
          @Override
          public void surfaceCreated(SurfaceHolder holder) {
              aliListPlayer.setSurface(holder.getSurface());
          }
      
          @Override
          public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
              aliListPlayer.surfaceChanged();
          }
      
          @Override
          public void surfaceDestroyed(SurfaceHolder holder) {
              aliListPlayer.setSurface(null);
          }
      });
    • 次のサンプルコードは、TextureView を使用してビューを設定する方法を示しています。

      コードの表示

      TextureView textureView = findViewById(R.id.texture_view);
      textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
          @Override
          public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
              aliListPlayer.setSurface(new Surface(surface));
          }
      
          @Override
          public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
              aliListPlayer.surfaceChanged();
          }
      
          @Override
          public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
              aliListPlayer.setSurface(null);
              return false;
          }
      
          @Override
          public void onSurfaceTextureUpdated(SurfaceTexture surface) {
      
          }
      });
  6. ビデオソースの再生

    1 つ以上の再生ソースを追加し、自動再生を有効にした後、moveTo を呼び出して、指定された再生ソースからコンテンツを再生します。サンプルコード:

    コードの表示

    // 自動再生を有効にします。
    aliListPlayer.setAutoPlay(true);
    
    // URL ベースの再生には次のメソッドを呼び出します。
    aliPlayer.moveTo(String uid);
    // Vid ベースの再生には次のメソッドを呼び出します。このメソッドを呼び出す前に、STS (Security Token Service) トークンと AccessKey ペアを取得する必要があります。詳細については、「RAM ロールの作成と STS を使用したロールへの一時的なアクセス権限の付与」をご参照ください。 
    aliPlayer.moveTo(String uid, StsInfo info);
  7. リスト内の前または次の動画を再生

    • moveTo を呼び出して動画を再生した後、moveToPrev を呼び出して前の動画を再生するか、moveToNext を呼び出して次の動画を再生できます。moveTo のビデオソースがアンカーポイントとして機能します。サンプルコード:

      説明

      moveto または moveToNext を呼び出して同じ view 内でビデオソースを切り替える際に、ちらつきのある黒い画面が表示される場合があります。この場合、listPlayer を初期化する際に、PlayerConfigmClearFrameWhenStop フィールドを false に設定し、setConfig を呼び出して設定を適用することを推奨します。

      コードの表示

      // 自動再生を有効にします。
      aliListPlayer.setAutoPlay(true);
      
      // 次の動画を再生します。このメソッドは URL ベースの再生でのみ呼び出すことができます。Vid ベースの再生では無効です。 
      aliListPlayer.moveToNext();
      // 前の動画を再生します。このメソッドは URL ベースの再生でのみ呼び出すことができます。Vid ベースの再生では無効です。 
      aliListPlayer.moveToPrev();
      // 次の動画を再生します。このメソッドは Vid ベースの再生でのみ呼び出すことができます。 
      aliListPlayer.moveToNext(StsInfo info);
      // 前の動画を再生します。このメソッドは Vid ベースの再生でのみ呼び出すことができます。 
      aliListPlayer.moveToPrev(StsInfo info);
説明

リスト再生でより良い体験を求める場合は、ミニドラマソリューションの使用を推奨します。詳細については、「ミニドラマのクライアント開発」をご参照ください。

透明度設定のある動画の再生

概要

ApsaraVideo Player SDK は、alpha チャンネルを持つ動画のレンダリングをサポートし、透明な背景を持つダイナミックなギフト動画を再生できます。これにより、視聴者はストリーミング中にライブビデオコンテンツを妨げられることなく、ダイナミックなギフト効果を見ることができ、視聴とインタラクティブな体験が大幅に向上します。

制限事項

透明度のある動画をレンダリングするには、ApsaraVideo MediaBox SDK V6.8.0 以降と ApsaraVideo Player SDK V6.9.0 以降を使用できます。

メリット

透明度のある MP4 動画を使用して、透明な背景を持つダイナミックなギフト動画を再生できます。これにより、パフォーマンス、動画の互換性が向上し、動画サイズが削減され、開発が簡素化されるため、ギフト効果の視聴体験が最適化され、ユーザー体験が向上します。透明度のある MP4 動画を使用してダイナミックなギフト動画を再生することには、次のメリットがあります。

  1. より高い動画品質:MP4 動画は、画像のディテールや色を含む、オリジナル品質でダイナミックなギフト効果を表示します。APNG や IXD などの他の形式と比較して、MP4 はデザイナーが意図したオリジナル品質を保持します。

  2. より小さい動画サイズ:APNG や IXD などの他の形式と比較して、MP4 はより効率的なファイルサイズ削減を実現し、読み込みを高速化し、ネットワーク帯域幅の消費を削減します。

  3. より良い互換性:MP4 は、さまざまなデバイスやブラウザで広くサポートされている汎用的な動画形式であり、主流のデバイスで MP4 ベースのギフト効果を再生できます。

  4. より高い開発効率:MP4 動画をダイナミックなギフトとして使用するには、簡単な開発が必要です。開発者は、複雑な解析およびレンダリングロジックを開発する代わりに、他の機能の実装に集中できるため、開発効率が向上します。

サンプルコード

setAlphaRenderMode オペレーションが追加されました。このオペレーションを呼び出して、動画素材の alpha チャンネルの位置 (例えば、動画素材の上、下、左、右) を指定できます。デフォルトでは、値は None に設定されています。

説明
  • 素材の alpha チャンネルの位置は、setAlphaRenderMode オペレーションを呼び出す際に指定した位置と一致する必要があります。

  • ビューサイズは、素材の解像度に比例する必要があります。

/**
 * alpha レンダリングモードを設定します
 *
 * @param alphaRenderMode alpha レンダリングモード。{@link AlphaRenderMode} をご参照ください。
 */
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------ビューの設定-------------
// 透明なビューを設定します。
//TextureView
TextureView aliplayerView; // 再生に使用するビュー。
aliplayerView.setOpaque(false);

//SurfaceView
SurfaceView aliplayerView; // 再生に使用するビュー。
aliplayerView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
aliplayerView.setZOrderOnTop(true); // SurfaceView をウィンドウの最上部に表示します。

//-----------AliPlayer の設定-----------
// alpha モードを設定します。
aliPlayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
// alpha モードに対応する素材を指定します。
UrlSource urlSource = new UrlSource();
urlSource.setUri("https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82%E6%A0%B7%E6%9C%AC/alpha%E9%80%9A%E9%81%93/alpha_right.mp4");
aliPlayer.setDataSource(urlSource);
aliPlayer.setOnCompletionListener(new IPlayer.OnCompletionListener() {
    @Override
    public void onCompletion() {
        // オプション。プレーヤーインスタンス内の動画の再生が完了したときに接続エラーが発生した場合、ビューをクリアできます。
        aliPlayer.clearScreen();
    }
}
aliPlayer.setAutoPlay(true);
aliPlayer.prepare();

外部字幕の設定

説明

詳細なコード例については、API-Example外部字幕の再生と切り替え (ExternalSubtitle) モジュールをご参照ください。このプロジェクトは、Java で書かれた ApsaraVideo Player SDK の Android サンプルプロジェクトであり、開発者がコア SDK の統合を迅速に習得するのに役立ちます。

ApsaraVideo Player SDK for Android を使用すると、SRT、SSA、ASS、または VTT 形式の外部字幕を動画に追加したり、切り替えたりできます。

以下に例を示します。

  1. 字幕を表示するビューの作成

    異なる形式の字幕には、異なるビューを作成する必要があります。

    コードの表示

    // SRT または VTT 形式の字幕を表示するビューを作成します。
    SubtitleView subtitleView = new SubtitleView(getContext());
    // Player SDK V7.6.0 以降では、SRT または VTT 形式の字幕を表示するために VttSubtitleView の使用を推奨します。
    VttSubtitleView vttSubtitleView = new VttSubtitleView(getContext());
    // ASS または SSA 形式の字幕を表示するビューを作成します。
    AssSubtitleView assSubtitleView = new AssSubtitleView(getContext());
    // 字幕を表示するビューをレイアウトビューに追加します。
    viewGroup.addView(assSubtitleView);

    Player SDK V7.6.0 以降を統合し、VttSubtitleView を使用して SRT および VTT 字幕を表示する場合は、次のリスナーを設定します。

    // Player SDK 7.6.0 以降で必須
    mAliPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() {
        @Override
        public void onVideoSizeChanged(int width, int height) {
            int viewWidth = getWidth();
            int viewHeight = getHeight();
            IPlayer.ScaleMode mode = mVideoListPlayer.getScaleMode();
            SubTitleBase.VideoDimensions videoDimensions = SubTitleBase.getVideoDimensionsWhenRenderChanged(width, height, viewWidth, viewHeight, mode);
            vttSubtitleView.setVideoRenderSize(videoDimensions.videoDisplayWidth, videoDimensions.videoDisplayHeight);
        }
    });
  2. 字幕の追加

    重要

    onPrepared で字幕ファイルを設定する必要があります。

    mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
        @Override
        public void onPrepared() {
            // 字幕の設定 (onPrepared で設定する必要があります)
            mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL);
        }
    });
  3. 字幕用リスナーの設定

    コードの表示

    mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
                @Override
                public void onSubtitleExtAdded(int trackIndex, String url) {
                    // trackIndex: 字幕インデックス; true: 指定した字幕を表示; false: 指定した字幕を非表示
                    mAliPlayer.selectExtSubtitle(trackIndex, true);
                }
    
                @Override
                public void onSubtitleShow(int trackIndex, long id, String data) {
                    // 字幕
                    SubtitleView.Subtitle subtitle = new SubtitleView.Subtitle();
                    subtitle.id = String.valueOf(id);
                    subtitle.content = data;
                    // 字幕を表示
                    mSubtitleView.show(subtitle);
                }
    
                @Override
                public void onSubtitleHide(int trackIndex, long id) {
                    // 字幕を削除
                    mSubtitleView.dismiss(String.valueOf(id));
                }
    
                @Override
                public void onSubtitleHeader(int trackIndex, String header) {
                }
            }
        );

外部字幕 (レンダリングコンポーネントによるカスタムレンダリング)

VttSubtitleViewWebVttResolver に基づいて、ApsaraVideo Player SDK は WebVTT 外部字幕を完全にサポートし、フォントサイズ、色、特定のフォントの柔軟なカスタマイズを可能にします。

説明

ユースケース:

  • WebVTT 字幕スタイルをカスタマイズする必要があります。

  • ApsaraVideo Player SDK V7.11.0 以降を統合します。

重要

前提条件:

  • フォントファイル (.ttf) は、プロジェクトの assets/fonts/ ディレクトリに配置されています。

  • プロジェクトの minSdk は 21 以降です (推奨)。

  • 字幕リスナーを追加し、WebVTT コンテンツを取得できます。

  1. CustomStyleWebVttResolver を作成し、WebVttResolver を実装します。

    public class CustomStyleWebVttResolver extends WebVttResolver {
    
        // コンストラクターを実装します
        public CustomStyleWebVttResolver(Context context) {
            super(context);
            // ここでフォントやその他のリソースを初期化します
        }
    }
  2. applyTextSpans をオーバーライドしてスタイルをカスタマイズします。

    このメソッドは、親クラスが基本的なスタイルを解析した後に呼び出され、字幕の二次処理を可能にします。

    • 方法 1:VttContentAttribute を変更し、親クラスのメソッドを呼び出します。

      /**
       * テキストスタイルの適用ロジックをオーバーライドして、カスタムスタイリング効果を実現します。
       * このメソッドは、親クラスが基本的なスタイルを解析した後に呼び出され、フォントサイズや色などのプロパティの二次処理を可能にします。
       *
       * @param spannableStringBuilder スタイル付きテキストを構築するために使用されます
       * @param vttContentAttribute 現在のテキストセグメントのスタイル属性 (フォント、色、サイズなどを含む)
       * @param start スタイル適用の開始位置 (含む)
       * @param end スタイル適用の終了位置 (含まない)
       */
      @Override
      protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) {
          // 後続の調整のために元のフォントサイズ (単位: px) を保存します
          // デフォルトのフォントサイズはビデオの高さの 0.0533f 倍です
          double originalFontSizePx = vttContentAttribute.fontSizePx;
      
          // フォントサイズを 2 倍にします
          vttContentAttribute.fontSizePx = originalFontSizePx * 2;
          
          // フォントの色を赤に変更します
          vttContentAttribute.mPrimaryColour = Color.argb(255, 255, 0, 0);
      
          // 親クラスのメソッドを呼び出してテキストスタイルを適用します
          super.applyTextSpans(spannableStringBuilder, vttContentAttribute, start, end);
      }
    • SpannableStringBuilder を直接操作して、WebVTT スタイルを直接変更します。

      重要

      この方法では、ネイティブの WebVTT スタイルが失われる可能性があります。

      /**
       * テキストスタイルの適用ロジックをオーバーライドして、カスタムスタイリング効果を実現します。
       * このメソッドは、親クラスが基本的なスタイルを解析した後に呼び出され、フォントサイズや色などのプロパティの二次処理を可能にします。
       *
       * @param spannableStringBuilder スタイル付きテキストを構築するために使用されます
       * @param vttContentAttribute 現在のテキストセグメントのスタイル属性 (フォント、色、サイズなどを含む)
       * @param start スタイル適用の開始位置 (含む)
       * @param end スタイル適用の終了位置 (含まない)
       */
      @Override
      protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) {
          // フォントの色を設定します
          spannableStringBuilder.setSpan(
              new ForegroundColorSpan(Color.RED),
              start, end,
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          );
          
          // 絶対フォントサイズを設定します
          spannableStringBuilder.setSpan(
              new AbsoluteSizeSpan(20), // 単位: px
              start, end,
              Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          );
          
          // 相対フォントサイズを設定します
          // spannableStringBuilder.setSpan(
          //     new RelativeSizeSpan(2.0f), // TextView のデフォルトフォントサイズの倍数
          //     start, end,
          //     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
          // );
      }
  3. カスタムフォント (Typeface) を設定します。

    1. プロジェクトの asset/fonts/ ディレクトリからカスタムフォントをロードします。

      private Typeface mTypeface;
      
      public CustomStyleWebVttResolver(Context context) {
          super(context);
          initializeFonts(context);
      }
      
      private void initializeFonts(Context context) {
          try {
              // assets/fonts/ からフォントをロードします
              mTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/LongCang.ttf");
          } catch (Exception e) {
              Log.e("Font", "Failed to load font", e);
              mTypeface = Typeface.DEFAULT; // 安全なフォールバック
          }
      }
    2. カスタムフォントを字幕に適用します。

      @Override
      protected void applyTextSpans(SpannableStringBuilder builder, VttContentAttribute attr, int start, int end) {
          // カスタムフォントを適用します
          // 親クラスによって設定される可能性のあるフォントを上書きするために、super.applyTextSpans() の後に配置する必要があります。
          // super.applyTextSpans() はオプションです。
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
              builder.setSpan(new TypefaceSpan(mTypeface), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
          } else {
              builder.setSpan(new CustomTypefaceSpan(mTypeface), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
          }
      }

      古い Android バージョンのサポート:Android P (API 28) 以前の TypefaceSpan は直接の Typeface オブジェクトをサポートしていないため、カスタムの MetricAffectingSpan を実装する必要があります。

      /**
        * カスタム Typeface Span クラス
        * MetricAffectingSpan を継承して、テキストの描画と測定中に Typeface を正しく適用します。
        * 標準の TypefaceSpan が Typeface オブジェクトを直接使用できない問題を解決します。
      */
      private static class CustomTypefaceSpan extends MetricAffectingSpan {
      
          // 適用するカスタムフォント
          private final Typeface typeface;
      
          /**
            * コンストラクター
            *
            * @param typeface 適用する Typeface オブジェクト (null であってはなりません)
            */
          public CustomTypefaceSpan(Typeface typeface) {
              this.typeface = typeface;
          }
      
          /**
            * テキスト描画状態を更新します
            * 実際のテキスト描画中に呼び出され、ペイントフォントを設定します。
            *
            * @param tp テキストを描画するために使用される TextPaint オブジェクト
            */
          @Override
          public void updateDrawState(TextPaint tp) {
              tp.setTypeface(typeface);
          }
      
          /**
            * テキスト測定状態を更新します
            * テキストレイアウト計算 (幅、改行など) 中に呼び出され、測定が実際の描画と一致することを確認します。
            *
            * @param p テキストを測定するために使用される TextPaint オブジェクト
            */
          @Override
          public void updateMeasureState(TextPaint p) {
              p.setTypeface(typeface);
          }
      }
  4. プレーヤーに統合します。

    1. 字幕ビューを初期化します。

      // subtitleView を初期化します
      private void initSubtitleView() {
          // コンテキストを取得します
          Context context = getContext();
      
          // CustomStyleWebVttResolver を作成します 
          CustomStyleWebVttResolver mResolver = new CustomStyleWebVttResolver(context);
      
          // VttSubtitleView を作成し、CustomStyleWebVttResolver を渡します
          VttSubtitleView mVttSubtitleView = new VttSubtitleView(context, mResolver);
      
          // ビデオコンテナに追加します
          rootView.addView(mVttSubtitleView);
      }
    2. 外部字幕コールバックをバインドします。

      // 字幕リスナーを設定します
      mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() {
          @Override
          public void onSubtitleExtAdded(int trackIndex, String url) {
              mAliPlayer.selectExtSubtitle(trackIndex, true);
          }
      
          @Override
          public void onSubtitleShow(int trackIndex, long id, String data) {
              if (mVttSubtitleView != null) {
                  // 字幕を表示します
                  mVttSubtitleView.show(id, data); 
              }
          }
      
          @Override
          public void onSubtitleHide(int trackIndex, long id) {
              // 字幕を非表示にします
              mVttSubtitleView.dismiss(id);
          }
      
          @Override
          public void onSubtitleHeader(int i, String header) {
              if (!TextUtils.isEmpty(header)) {
                  // WebVTT ヘッダースタイルを適用します
                  mVttSubtitleView.setVttHeader(header);
              }
          }
      });

音声のみの再生の有効化

ビデオ画像の表示機能を無効にして、音声のみの再生を有効にすることができます。prepare メソッドを呼び出す前に、PlayerConfig クラスを設定します。

PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true; // 音声のみの再生を有効にします。
aliPlayer.setConfig(config);

ソフトウェアデコードとハードウェアデコードの切り替え

説明

デコード方法は再生開始前に変更する必要があります。再生中に変更しても効果はありません。

ApsaraVideo Player SDK for Android は、H.264 および H.265 標準に基づくハードウェアデコードをサポートしています。enableHardwareDecoder を呼び出して、ハードウェアデコードを有効または無効にできます。デフォルトでは、ハードウェアデコードが有効になっています。ハードウェアデコードの初期化に失敗した場合、通常の再生を確保するためにソフトウェアデコードに切り替わります。サンプルコード:

// ハードウェアデコードを有効にします。ハードウェアデコードはデフォルトで有効です。
aliPlayer.enableHardwareDecoder(true);

ハードウェアデコードがソフトウェアデコードに切り替わると、onInfo コールバックが呼び出されます。サンプルコード:

mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
            // ソフトウェアデコードに切り替えます。
        }
    }
});

H.265 アダプティブ再生

現在のモデルがクラウドの H.265 モデルブラックリストに含まれている場合、または H.265 ストリームのデコードに失敗した場合、アダプティブストリーミングがトリガーされます。セカンダリ H.264 ストリームを設定している場合、システムは自動的にセカンダリ H.264 ストリームを再生します。セカンダリ ストリームを設定していない場合、H.265 再生には自動的にソフトウェアデコードが使用されます。

説明
  • この機能は、アダプティブ再生を有効にした後にのみ利用可能です。アダプティブ再生は付加価値サービスです。付加価値サービスを有効にするには、Yida でリクエストを送信してください。

  • クライアント-クラウド統合アダプティブデコード付加価値サービスは、次の機能を提供します:クラウド側ハードウェアデコードの互換性データの動的配信、および H.265 ストリームの H.264 ストリームへのアダプティブなスペックダウン。

  • アダプティブ再生サービスを有効にしていない場合でも、プレーヤー SDK はハードウェアデコードが失敗したときに自動的にソフトウェアデコードを使用できます。

次のサンプルコードは、セカンダリ ストリームを設定する方法を示しています。

// アプリケーション層でマップを作成し、プライマリストリーム URL とセカンダリストリーム URL をキーと値のペアとして保存します。システムは、切り替え中にプライマリストリーム URL に基づいて対応するセカンダリ URL をクエリします。
 AliPlayerGlobalSettings.setAdaptiveDecoderGetBackupURLCallback(new AliPlayerGlobalSettings.OnGetBackupUrlCallback() {
    @Override
    public String getBackupUrlCallback(int oriBizScene, int oriCodecType, String original_url) {
        String kurl = original_url;
        if (!H265toH264Map.get(kurl).isEmpty()) {
            return H265toH264Map.get(kurl);
        } else {
            return "";
        }
    }
});

アダプティブビットレートストリーミング

説明
  • ApsaraVideo VOD トランスコードテンプレートグループを使用して、ビデオを HTTP ライブストリーミング (HLS) アダプティブビットレートストリームにトランスコードできます。詳細については、「ビデオオンデマンドのアダプティブビットレートストリーミング設定」をご参照ください。

  • ApsaraVideo VOD によってトランスコードされたアダプティブビットレートストリームに Vid ベースの再生を使用する場合、デフォルトの再生解像度として DEFINITION_AUTO を指定する必要があります。これにより、プレーヤーはアダプティブビットレートストリームを取得して再生できます。デフォルトの再生解像度として AUTO を指定しない場合、プレーヤーは自動的に低解像度のビデオストリームを再生します。ビデオ解像度に基づく再生順序の詳細については、「複数の解像度が利用可能な場合、Player SDK はデフォルトでどのビデオ解像度を再生しますか?」をご参照ください。次のサンプルコードは、VidAuth ベースの再生でデフォルトの再生解像度を指定する方法の例を示しています。

    VidAuth vidAuth = new VidAuth();
    List<Definition> list = new ArrayList<>();
    list.add(Definition.DEFINITION_AUTO);
    vidAuth.setDefinition(list);

ApsaraVideo Player SDK for Android は、HLS または DASH ビデオストリームのアダプティブビットレートストリーミングをサポートしています。prepare メソッドが呼び出された後、getMediaInfo を呼び出して、TrackInfo によって示されるビットレート情報を取得します。サンプルコード:

List<TrackInfo> trackInfos  = aliPlayer.getMediaInfo().getTrackInfos();

再生中に、selectTrack メソッドを呼び出してビットレートを切り替えることができます。AUTO_SELECT_INDEX を指定すると、アダプティブビットレートストリーミングが有効になります。サンプルコード:

int index = trackInfo.getIndex();
// ビットレートを切り替えます。
aliPlayer.selectTrack(index);
// アダプティブビットレートストリーミングを有効にします。
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);

切り替え結果は OnTrackChangedListener コールバックで返されます。selectTrack を呼び出す前に OnTrackChangedListener コールバックを設定する必要があります。サンプルコード:

aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
    @Override
    public void onChangedSuccess(TrackInfo trackInfo) {
        // ビットレートの切り替えは成功しました。
    }
    @Override
    public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
        // ビットレートの切り替えは失敗しました。errorInfo.getMsg() メソッドを呼び出して失敗の原因を見つけることができます。
    }
});

オプション。 selectTrack メソッドを呼び出して再生コードストリームをアダプティブビットレートに切り替える前に、config パラメーターを指定してアダプティブビットレートの最大解像度を設定し、予期しないビットレートへの自動切り替えを回避できます。プレーヤーが prepare メソッドを呼び出す前、またはリストプレーヤーが moveTo メソッドを呼び出す前に、次のコードを実行して有効にすることを推奨します。

PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; // アダプティブビットレートの上限に対応するピクセル数を 921,600 (長さ × 幅 = 1280 × 720) に設定します。これにより、解像度に対応するピクセル数がこの値以下になります。
aliPlayer.setConfig(config);

スナップショットのキャプチャ

ApsaraVideo Player SDK for Android は、ビデオスナップショットをキャプチャするための snapshot メソッドを提供します。スナップショットをキャプチャすると、プレーヤーはビデオ画像のソースデータを保存し、それを bitmap に変換します。その後、OnSnapShotListener を呼び出してビットマップを取得できます。サンプルコード:

// スナップショットキャプチャのコールバックを設定します。
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // ビットマップとビデオ画像の幅と高さを取得します。 
    }
});
// 現在のビデオ画像のスナップショットをキャプチャします。
aliPlayer.snapshot();

プレビュー

ApsaraVideo Player SDK for Android は、ApsaraVideo VOD の特定の構成を統合して、ビデオプレビューをサポートします。VidSts および VidAuth ソースのみがプレビューできます。ApsaraVideo VOD では VidAuth ソースのみをプレビューすることを推奨します。プレビュー機能の設定と使用方法の詳細については、「ビデオのプレビュー」をご参照ください。

プレビュー機能を有効にした後、VidPlayerConfigGen.setPreviewTime() メソッドを呼び出してプレビュー時間を指定できます。次のサンプルコードは、VidSts ベースの再生でプレビュー時間を指定する方法の例を示しています。

VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// プレビュー時間を 20 秒に設定します。
vidSts.setPlayConfig(configGen);// ビデオソースを指定します。
...

トライアル再生時間を設定し、Android プレーヤー SDK を使用してビデオを再生すると、サーバーは完全なビデオコンテンツではなく、トライアルセグメントコンテンツを返します。

説明
  • VidPlayerConfigGen を呼び出して、サーバーがサポートするリクエストパラメーターを設定できます。詳細については、「リクエストパラメーターの説明」をご参照ください。

  • プレビュー機能は、Flash Video (FLV) および MP3 ファイルではサポートされていません。

ブラックリストの設定

ApsaraVideo Player SDK for Android を使用すると、ハードウェアデコードのブラックリストを設定できます。デバイスでハードウェアデコードが許可されていない場合、ソフトウェアデコードを使用してデコード失敗を防ぐことができます。サンプルコード:

DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );
説明

ブラックリストは、アプリケーションを終了すると無効になります。

Referer の設定

ApsaraVideo Player SDK for Android は、リクエスト Referer を設定するための PlayerConfig クラスを提供します。Referer を ApsaraVideo VOD コンソールで設定された Referer ホワイトリストまたはブラックリストと組み合わせて使用して、アクセス制御を実装できます。次のサンプルコードは例を示しています。

// 構成情報を取得します。
PlayerConfig config = aliPlayer.getConfig();
// Referer を設定します。例:http://example.aliyundoc.com。Referer を設定する際には、プロトコルヘッダーを追加する必要があります。
config.mReferrer = referrer;
....// 他の設定を構成します。
  // プレーヤーの設定を構成します。
aliPlayer.setConfig(config);

User-Agent ヘッダーの指定

ApsaraVideo Player SDK for Android は、リクエストのユーザーエージェントを指定するための PlayerConfig クラスを提供します。User-Agent ヘッダーを指定すると、プレーヤーはリクエストにユーザーエージェント情報を含めます。サンプルコード:

// 構成情報を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ユーザーエージェントを設定します。
config.mUserAgent = "Required user agent";
....// 他の設定を構成します。
  // プレーヤーの設定を構成します。
aliPlayer.setConfig(config);

ネットワークタイムアウト期間と再試行回数の設定

ApsaraVideo Player SDK for Android は、ネットワークタイムアウト期間とリトライ回数を設定するための PlayerConfig クラスを提供します。サンプルコード:

// 構成情報を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ネットワークタイムアウト期間を指定します。単位: ミリ秒。
config.mNetworkTimeout = 5000;
// ネットワークタイムアウト時の最大リトライ回数を指定します。再試行間隔は、NetworkTimeout パラメーターで指定されたタイムアウト期間と同じです。NetworkRetryCount パラメーターはリトライ回数を指定します。値が 0 の場合はリトライしないことを示します。アプリケーションがリトライ回数を決定します。デフォルト値: 2。
config.mNetworkRetryCount=2;
....// 他の設定を構成します。
  // プレーヤーの設定を構成します。
aliPlayer.setConfig(config);
説明
  • NetworkRetryCount パラメーターを 0 以外の値に設定すると、ネットワークエラーによりデータのロードが開始された際に、プレーヤーが再生の再試行を行います。最大再試行回数は NetworkRetryCount パラメーターの値と等しくなります。再試行間隔は NetworkTimeout パラメーターの値と等しくなります。

  • 最大リトライ回数に達した後もロードが継続する場合、onError メソッドはコールバックを呼び出します。この場合、ErrorInfo.getCode() メソッドは ErrorCode.ERROR_LOADING_TIMEOUT を返します。

  • NetworkRetryCount パラメーターを 0 に設定すると、ネットワークタイムアウトの発生時に onInfo メソッドがコールバックを呼び出します。この場合、InfoBean.getCode() は InfoCode.NetworkRetry を返します。この問題を解決するには、ApsaraVideo Player SDK for Android の reload メソッドを呼び出して、ネットワークパケットを再読み込みするか、その他の必要な操作を実行できます。

バッファとレイテンシーの制御

ApsaraVideo Player SDK for Android は、バッファとレイテンシーの設定を構成するための PlayerConfig クラスを提供します。サンプルコード:

コードの表示

// 構成情報を取得します。
PlayerConfig config = aliPlayer.getConfig();
// 最大遅延時間を設定します。このパラメーターはライブストリーミングでのみ有効です。遅延が過度に高い場合、Player SDK はフレームを同期して遅延が制限を超えないようにします。 
config.mMaxDelayTime = 5000;
// 最大バッファ期間を設定します。単位:ミリ秒。このパラメーターは、プレーヤーが一度にデータをロードするための最大バッファ期間を指定します。 
config.mMaxBufferDuration = 50000;
// ピークバッファ期間を設定します。単位:ミリ秒。ネットワーク状態が悪い場合、プレーヤーはピークバッファ期間が経過するとデータのロードを停止します。 
config.mHighBufferDuration = 3000;
// 起動バッファ期間を設定します。単位:ミリ秒。値が小さいほど起動時間が短くなります。この場合、プレーヤーは再生開始後すぐにデータのロードを開始します。 
config.mStartBufferDuration = 500;
....// 他の設定を構成します。
// 最大キャッシュ期間を設定します。単位:ミリ秒。デフォルト値:0。 
config.mMaxBackwardBufferDurationMs = 0;

// プレーヤーの設定を構成します。
aliPlayer.setConfig(config);

重要
  • バッファ期間が次の条件を満たすことを確認してください:mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration。

  • 最大バッファ期間 (mMaxBufferDuration) を 5 分を超える値に設定した場合、過剰なバッファサイズによるメモリ例外を防ぐために、システムはデフォルトで 5 分に設定します。

HTTP ヘッダーの設定

ApsaraVideo Player SDK for Android は、リクエストに HTTP ヘッダーを追加するための PlayerConfig クラスを提供します。サンプルコード:

// 構成情報を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ヘッダーを定義します。
String[] headers = new String[1];
headers[0]="Host:example.com"; // 例えば、ホスト情報をヘッダーに追加します。 
// ヘッダーを構成します。
config.setCustomHeaders(headers);
....// 他の設定を構成します。
  // プレーヤーの設定を構成します。
aliPlayer.setConfig(config);

ピクチャーインピクチャー (PiP)

説明

詳細なコード例については、API-ExamplePiP 再生 (PictureInPicture) モジュールをご参照ください。このプロジェクトは、Java で書かれた ApsaraVideo Player SDK の Android サンプルプロジェクトであり、開発者がコア SDK の統合を迅速に習得するのに役立ちます。

操作手順:

  1. AndroidManifest.xml ファイルで、PiP 権限を宣言します。

    <activity
      android:name=".PictureInPictureActivity"
      android:exported="true"
      android:supportsPictureInPicture="true"
      android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />
  2. ターゲットの Activity を PiP モードに切り替えます。

    Rational aspectRatio = new Rational(16, 9); // PiP のアスペクト比。ビジネスニーズに応じて調整してください。
    PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
    pipBuilder.setAspectRatio(aspectRatio);
    enterPictureInPictureMode(pipBuilder.build());

    PiP モードは、OnClick イベント、アプリを離れるとき、またはアプリに戻るときにトリガーできます。実装方法は次のとおりです。

    OnClick (クリックイベント) トリガー

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Rational aspectRatio = new Rational(16, 9); // PiP のアスペクト比
            PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
            pipBuilder.setAspectRatio(aspectRatio);
            enterPictureInPictureMode(pipBuilder.build());
        }
    });

    アプリを離れるときのトリガー

    @Override
    protected void onUserLeaveHint() {
        super.onUserLeaveHint();
        Rational aspectRatio = new Rational(16, 9); // PiP のアスペクト比
        PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
        pipBuilder.setAspectRatio(aspectRatio);
        enterPictureInPictureMode(pipBuilder.build());
    
        Log.e(TAG, "PiP onUserLeaveHint");
    }

    アプリに戻るときのトリガー

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // 戻るボタンの押下からトリガー
        enterPictureInPictureMode();
    }
  3. PiP の表示/非表示の UI を処理します。

    @Override
    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
        if (isInPictureInPictureMode) {
            // PiP モードへの移行を処理
            // UI を非表示
            Log.e(TAG, "Entered PiP mode");
        } else {
            // PiP モードからの離脱を処理
            // UI を表示 
            Log.e(TAG, "Exited PiP mode");
        }
    }

ライブストリーミング RTS のデグレード

説明

詳細なコード例については、API-Example超低遅延 RTS ライブストリーミング (RtsLiveStream) モジュールをご参照ください。このプロジェクトは、Java で書かれた ApsaraVideo Player SDK の Android サンプルプロジェクトであり、開発者がコア SDK の統合を迅速に習得するのに役立ちます。

詳細については、「RTS ライブストリーミング」をご参照ください。

左右の音声チャンネルの切り替え

ApsaraVideo Player SDK for Android は、setOutputAudioChannel メソッドを使用して出力音声チャンネルを指定します。入力ソースに 2 つの音声チャンネルが含まれている場合、左右の音声チャンネルを切り替えることができます。入力ソースに 1 つの音声チャンネルしか含まれていない場合、outputAudioChannel の設定は無効です。

説明

以下の出力チャンネル設定は、音声レンダリングと PCM データコールバックの両方に影響します。

/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT を指定して、左の音声チャンネルで再生します。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT を指定して、右の音声チャンネルで再生します。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE を指定して、入力ファイルの音声チャンネル設定を使用します。
*/
aliPlayer.setOutputAudioChannel();

音声ストリームの解析

リスナーを設定して、音声ストリームとビデオストリームに関する情報を取得できます。暗号化された音声ストリームとビデオストリームは解析できません。

コードの表示

// オプション。基盤となるデータのアドレスを返すかどうかを指定します。
IPlayer.RenderFrameCallbackConfig config = new IPlayer.RenderFrameCallbackConfig();
config.mVideoDataAddr = true;// 基盤となるビデオデータのアドレスのみを返すかどうかを指定します。
config.mAudioDataAddr = true;// 基盤となる音声データのアドレスのみを返すかどうかを指定します。
aliPlayer.setRenderFrameCallbackConfig(config);

// オプション。ハードウェアデコード後の RenderFrame には texture_oes_id を返し、ソフトウェアデコード後の RenderFrame にはソースデータを返します。
aliPlayer.enableHardwareDecoder(true);
// リスナーを設定して、音声ストリームとビデオストリームに関する情報を取得します。
aliPlayer.setOnRenderFrameCallback(frameInfo -> {
    if (frameInfo.frameType == FrameInfo.FrameType_video) {
        // ビデオデータ。
    } else {
        // 音声データ。
    }
    return false;
});

ビデオの背景色の設定

ApsaraVideo Player SDK for Android を使用する際に、プレーヤーの背景色を設定できます。次のサンプルコードは、メソッドの宣言と呼び出し方法の例を示しています。

API の例

/**
 * ビデオの背景色を設定します。
 *
 * @param color  ARGB
 *
 */
/****
 * ビデオの背景色を設定します
 * @param color  ARGB
 */
abstract public void setVideoBackgroundColor(int color);

使用上の注意

// パラメーター値は 8 桁の 16 進数 ARGB カラー値です。8 桁の ARGB カラー値の最初の 2 桁はアルファ、次の 2 桁は赤、次の 2 桁は緑、最後の 2 桁は青を表します。
// 例えば、値 0x0000ff00 は緑を指定します。
aliPlayer.setVideoBackgroundColor(0x0000ff00);

vidAuth ベースの再生用のドメイン名の指定

vidAuth メソッドを使用すると、vid に関連付けられたドメイン名などのフィールドを指定できます。サポートされているフィールドの詳細については、「GetPlayInfo リクエストパラメーター」をご参照ください。API とその使用方法は以下のとおりです。

API の例

/**
 * 再生パラメーターを設定します。
 *
 * @param playConfig 再生パラメーター。
 */
public void setPlayConfig(VidPlayerConfigGen playConfig);

使用上の注意

VidPlayerConfigGen で addPlayerConfig を呼び出す際に playDomain パラメーターを指定します。

vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
// playDomain フィールドを追加します。設定可能なフィールドの詳細については、以下をご参照ください。
// https://www.alibabacloud.com/help/vod/developer-reference/api-vod-2017-03-21-getplayinfo
configGen.addPlayerConfig("playDomain", "com.xxx.xxx");
vidAuth.setPlayConfig(configGen);

H.266 デコードプラグイン

H.266 (VVC/Versatile Video Coding) は、最新のビデオコーディング標準として、同じ視覚品質を維持しながらビットレートを大幅に削減します。パフォーマンスを最適化し、メイン SDK サイズを制御するために、H.266 デコード機能は、オンデマンド統合用の別のプラグインとしてパッケージ化されています。

前提条件

  1. プレーヤーまたはオールインワン SDK のバージョンは V7.6.0 以降です。

  2. Professional Edition のライセンスを取得していること。詳細については、「Player SDK ライセンスの取得」をご参照ください。

  3. H.266 デコードプラグインを備えた ApsaraVideo Player は、ApsaraVideo VOD トランスコーディングによってエンコードされた H.266 ビデオの再生のみをサポートします。

プラグインの統合

Player SDK

Maven 統合 (推奨)

指定したプラグインバージョンの依存関係をアプリの build.gradle ファイルに追加します。

説明

ApsaraVideo Player SDK の最新バージョンについては、「Android SDK リリース履歴」をご参照ください。

// x.x.x は Player SDK のバージョン番号と一致する必要があります
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x

ローカル統合

ApsaraVideo Player SDK の最新バージョンをダウンロードし、AlivcVVCCodec パッケージをプロジェクトの libs ディレクトリにコピーします (libs ディレクトリが存在しない場合は手動で作成します)。詳細については、「ローカル統合」をご参照ください。

オールインワン SDK

Maven 統合

指定したプラグインバージョンの依存関係をアプリの build.gradle ファイルに追加します。

// x.x.x はオールインワン SDK のバージョン番号と一致する必要があります
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x-aio

プラグインの有効化

説明

ApsaraVideo Player SDK V7.7.0 以降、プラグインは統合後にデフォルトで有効になります。手動での有効化は不要です。

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

関連するエラーコード

H.266 デコードプラグインに関連するエラーコードについては、「プラットフォーム共通の問題」をご参照ください。

再生ソースの自動更新

再生ソースの自動更新を有効にすると、認証の期限切れによる再生の中断を防ぐことができます。この機能は、ソースの有効期限が切れたときにリスナーをトリガーし、新しい URL を取得して、継続的でスムーズなビデオ再生を保証します。

前提条件

  1. プレーヤーまたはオールインワン SDK のバージョンは V7.9.0 以降です。

  2. VidAuth ソースを再生に使用するか、ビジネスでURL 署名を設定していること。

VidAuth ソース

インターフェイスの例

/**
 * VidAuth ソースの有効期限リスナーを設定します。
 *
 * この機能により、VidAuth ソースの自動更新が可能になり、有効期限切れによる再生の中断を回避できます。
 * リスナーがトリガーされると、VidAuth ソースを更新し、
 * {@link SourceRefreshCallback#onSuccess} を使用して更新された VidAuth を返すことができます。
 *
 * @param listener VidAuth ソースの有効期限イベントをリッスンするインターフェイス。{@link OnVidAuthExpiredListener} をご参照ください。
 */
/****
 * VidAuth ソースの有効期限イベントのリスナーを設定します。
 *
 * この機能により、VidAuth ソースの自動更新が可能になり、有効期限切れによる再生の中断を回避できます。
 * リスナーがトリガーされると、VidAuth ソースを更新し、
 * {@link SourceRefreshCallback#onSuccess} を使用して更新された VidAuth を返すことができます。
 *
 * @param listener VidAuth ソースの有効期限イベントをリッスンするインターフェイス。{@link OnVidAuthExpiredListener} をご参照ください。
 *
 */
abstract public void setOnVidAuthExpiredListener(OnVidAuthExpiredListener listener);

機能の構成

機能の構成

/**
 * VidAuth ソースの有効期限通知リスナー。VidAuth ソースの有効期限イベントを処理するために使用されます。
 */
/****
 * VidAuth ソースの有効期限通知のリスナー。
 * VidAuth ソースが期限切れになったときのイベントを処理します。
 */
public interface OnVidAuthExpiredListener {

    /**
     * プレーヤーが VidAuth ソースの有効期限が切れたことを検出したときに呼び出されます。
     *
     * このコールバックで VidAuth ソースを更新し、新しい VidAuth を
     * {@link SourceRefreshCallback#onSuccess} を使用して返すことができます。
     *
     * @param expiredSource 期限切れの VidAuth ソースオブジェクト。{@link VidAuth} をご参照ください。
     * @param callback 更新された VidAuth ソースをプレーヤーに提供するために使用されるコールバック。{@link SourceRefreshCallback} をご参照ください。
     */
    /****
     * プレーヤーが VidAuth ソースの有効期限が切れたことを検出したときに呼び出されます。
     *
     * このコールバックで VidAuth ソースを更新し、新しい VidAuth を
     * {@link SourceRefreshCallback#onSuccess} を使用して返すことができます。
     *
     * @param expiredSource 期限切れの VidAuth ソースオブジェクト。{@link VidAuth} をご参照ください。
     * @param callback 更新された VidAuth ソースをプレーヤーに提供するために使用されるコールバック。{@link SourceRefreshCallback} をご参照ください。
     */
    void onVidAuthExpired(VidAuth expiredSource, SourceRefreshCallback<VidAuth> callback);
}

/**
 * 再生ソース更新コールバックインターフェイス。再生ソースの更新結果を処理するために使用されます。
 *
 * このインターフェイスは、URL ソースや VidAuth ソースなど、動的な更新が必要な再生ソースタイプに適用されます。
 * プレーヤーが更新リクエストをトリガーすると、`onSuccess` または `onError` メソッドのいずれかを呼び出すことで、
 * このインターフェイスを介して更新結果を返すことができます。
 */
/****
 * 再生ソースの更新結果を処理するためのコールバックインターフェイス。
 *
 * このインターフェイスは、URL ソースや VidAuth ソースなど、動的な更新が必要な再生ソースタイプに適用されます。
 * プレーヤーが更新リクエストをトリガーすると、`onSuccess` または `onError` メソッドのいずれかを呼び出すことで、
 * このインターフェイスを介して更新結果を返すことができます。
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * 更新操作が成功したときにプレーヤーによって呼び出されます。
     *
     * @param newSource 更新された情報を含む新しい再生ソースオブジェクト。{@link SourceBase} をご参照ください。
     *
     * このメソッドは、更新操作が正常に完了したことを示します。開発者は、
     * プレーヤーが最新のリソースをロードできるように、このメソッド内で新しい再生ソースを提供する必要があります。
     */
    /****
     * 更新操作が成功したときにプレーヤーによって呼び出されます。
     *
     * @param newSource 更新された情報を含む新しい再生ソースオブジェクト。{@link SourceBase} をご参照ください。
     *
     * このメソッドは、更新操作が正常に完了したことを示します。開発者は、
     * プレーヤーが最新のリソースをロードできるように、このメソッド内で新しい再生ソースを提供する必要があります。
     */
    void onSuccess(T newSource);

    /**
     * 更新操作が失敗したときにプレーヤーによって呼び出されます。
     *
     * @param errorMsg 失敗の理由を説明する文字列。
     *
     * このメソッドは、更新操作が失敗したことを示します。開発者は `errorMsg` を使用して
     * 失敗の詳細をキャプチャし、後続の処理に進むことができます。
     */
    /****
     * 更新操作が失敗したときにプレーヤーによって呼び出されます。
     *
     * @param errorMsg 失敗の理由を説明する文字列。
     *
     * このメソッドは、更新操作が失敗したことを示します。開発者は `errorMsg` を使用して
     * 失敗の詳細をキャプチャし、後続の処理に進むことができます。
     */
    void onError(String errorMsg);
}

使用上の注意

GetVideoPlayAuth オペレーションを呼び出すことで、ビデオ再生認証情報を取得できます。自己署名を避け、認証情報を取得するために ApsaraVideo VOD サーバー SDK を統合することを推奨します。詳細については、OpenAPI ポータルをご参照ください。

// VID 再生認証情報有効期限リスナーを設定します
aliPlayer.setOnVidAuthExpiredListener(new AliPlayer.OnVidAuthExpiredListener() {
    @Override
    public void onVidAuthExpired(VidAuth vidAuth, UrlPlayer.SourceRefreshCallback<VidAuth> sourceRefreshCallback) {
        
        String vid = vidAuth.getVid();

        // ------------------- ユーザー実装開始 -------------------
        // 独自の関数を呼び出して、アプリサーバーから新しい PlayAuth を取得します。
        // clinetGetPlayAuthFunction はサンプル関数名です。独自の実装に置き換えてください。
        clinetGetPlayAuthFunction(vid, new PlayAuthCallback() {
            
            /**
             * 新しい認証情報の取得に成功した場合のコールバック。
             * @param newPlayAuth サーバーから取得した新しい再生認証情報文字列。
             */
            @Override
            public void onAuthSuccess(String newPlayAuth) {                
                // 1. 古い vidAuth オブジェクトを新しい PlayAuth で更新します
                vidAuth.setPlayAuth(newPlayAuth);
                
                // 2. SDK コールバックを介して更新されたオブジェクトをプレーヤーに返します
                sourceRefreshCallback.onSuccess(vidAuth);
            }

            /**
             * 新しい認証情報の取得に失敗した場合のコールバック。
             * @param errorMessage 詳細なエラーメッセージ。
             */
            @Override
            public void onAuthError(String errorMessage) {                
                // SDK コールバックを介してエラーメッセージをプレーヤーに返します
                sourceRefreshCallback.onError(errorMessage);
            }
        });
        // ------------------- ユーザー実装終了 -------------------
    }
});

UrlSource ソース

インターフェイスの例

/**
 * URL ソースの有効期限リスナーを設定します。
 *
 * この機能により、認証による URL の有効期限切れによる再生の中断を回避するための
 * URL 更新が可能になります。リスナーがトリガーされると、
 * URL ソースを更新し、{@link SourceRefreshCallback#onSuccess} を使用して更新された URL ソースを返すことができます。
 *
 * @param listener URL ソースの有効期限イベントを処理するためのリスナー。{@link OnURLSourceExpiredListener} をご参照ください。
 *
 * <p>URL 認証の設定に関する詳細については、
 * <a href="https://www.alibabacloud.com/help/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL 認証ドキュメント</a>をご参照ください。</p>
 */
/****
 * URL ソースの有効期限イベントのリスナーを設定します。
 *
 * この機能により、認証による URL の有効期限切れによる再生の中断を回避するための
 * URL 更新が可能になります。リスナーがトリガーされると、
 * URL ソースを更新し、{@link SourceRefreshCallback#onSuccess} を使用して更新された URL ソースを返すことができます。
 *
 * @param listener URL ソースの有効期限イベントを処理するためのリスナー。{@link OnURLSourceExpiredListener} をご参照ください。
 *
 * <p>URL 認証の設定に関する詳細については、
 * <a href="https://www.alibabacloud.com/help/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL 認証ドキュメント</a>をご参照ください。</p>
 */
abstract public void setOnURLSourceExpiredListener(OnURLSourceExpiredListener listener);

機能の構成

機能の構成

/**
 * 再生ソース更新コールバックインターフェイス。再生ソースの更新結果を処理するために使用されます。
 *
 * このインターフェイスは、URL ソースや VidAuth ソースなど、動的な更新が必要な再生ソースタイプに適用されます。
 * プレーヤーが更新リクエストをトリガーすると、`onSuccess` または `onError` メソッドのいずれかを呼び出すことで、
 * このインターフェイスを介して更新結果を返すことができます。
 */
/****
 * 再生ソースの更新結果を処理するためのコールバックインターフェイス。
 *
 * このインターフェイスは、URL ソースや VidAuth ソースなど、動的な更新が必要な再生ソースタイプに適用されます。
 * プレーヤーが更新リクエストをトリガーすると、`onSuccess` または `onError` メソッドのいずれかを呼び出すことで、
 * このインターフェイスを介して更新結果を返すことができます。
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * 更新操作が成功したときにプレーヤーによって呼び出されます。
     *
     * @param newSource 更新された情報を含む新しい再生ソースオブジェクト。{@link SourceBase} をご参照ください。
     *
     * このメソッドは、更新操作が正常に完了したことを示します。開発者は、
     * プレーヤーが最新のリソースをロードできるように、このメソッド内で新しい再生ソースを提供する必要があります。
     */
    /****
     * 更新操作が成功したときにプレーヤーによって呼び出されます。
     *
     * @param newSource 更新された情報を含む新しい再生ソースオブジェクト。{@link SourceBase} をご参照ください。
     *
     * このメソッドは、更新操作が正常に完了したことを示します。開発者は、
     * プレーヤーが最新のリソースをロードできるように、このメソッド内で新しい再生ソースを提供する必要があります。
     */
    void onSuccess(T newSource);

    /**
     * 更新操作が失敗したときにプレーヤーによって呼び出されます。
     *
     * @param errorMsg 失敗の理由を説明する文字列。
     *
     * このメソッドは、更新操作が失敗したことを示します。開発者は `errorMsg` を使用して
     * 失敗の詳細をキャプチャし、後続の処理に進むことができます。
     */
    /****
     * 更新操作が失敗したときにプレーヤーによって呼び出されます。
     *
     * @param errorMsg 失敗の理由を説明する文字列。
     *
     * このメソッドは、更新操作が失敗したことを示します。開発者は `errorMsg` を使用して
     * 失敗の詳細をキャプチャし、後続の処理に進むことができます。
     */
    void onError(String errorMsg);
}

/**
 * URL ソースの有効期限通知リスナー。期限切れのソースを処理し、再生の中断を防ぐために使用されます。
 */
/****
 * URL ソースの有効期限通知のリスナー。
 * これにより、期限切れのソースを処理し、再生の中断を防ぐことができます。
 */
public interface OnURLSourceExpiredListener {

    /**
     * プレーヤーが URL ソース (UrlSource) の有効期限が切れたことを検出したときに呼び出されます。
     *
     * このコールバックで URL ソースを更新し、新しい UrlSource を
     * {@link SourceRefreshCallback#onSuccess} を使用して返すことができます。
     *
     * @param expiredSource 期限切れの UrlSource オブジェクト。{@link UrlSource} をご参照ください。
     * @param callback 更新された UrlSource をプレーヤーに返すために使用される更新コールバック。{@link SourceRefreshCallback} をご参照ください。
     */
    /****
     * プレーヤーが URL ソース (UrlSource) の有効期限が切れたことを検出したときに呼び出されます。
     *
     * このコールバックで URL ソースを更新し、新しい UrlSource を
     * {@link SourceRefreshCallback#onSuccess} を使用して返すことができます。
     *
     * @param expiredSource 期限切れの UrlSource オブジェクト。{@link UrlSource} をご参照ください。
     * @param callback 更新された UrlSource をプレーヤーに返すために使用される更新コールバック。{@link SourceRefreshCallback} をご参照ください。
     */
    void onUrlSourceExpired(UrlSource expiredSource, SourceRefreshCallback<UrlSource> callback);
}

使用上の注意

// プレーヤーの URL 有効期限リスナーを設定します
mAliyunVodPlayer.setOnURLSourceExpiredListener(new UrlPlayer.OnURLSourceExpiredListener() {
    @Override
    public void onUrlSourceExpired(UrlSource urlSource, UrlPlayer.SourceRefreshCallback<UrlSource> sourceRefreshCallback) {
        String expiredUrl = urlSource.getUri();
        Log.d(TAG, "[onUrlSourceExpired] Received expired URL: " + expiredUrl);

        // 1. 認証キーが有効かどうかを確認します (authenticationKey がメンバー変数であると仮定)
        if (authenticationKey == null || authenticationKey.trim().isEmpty()) {
            Log.e(TAG, "Refresh failed: Authentication key is empty.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Authentication key is missing.");
            return; // 無効なキー、早期に終了
        }

        // 2. 再生 URL の有効期限を計算します (有効期間)
        // クラスメンバーの validTime が有効な場合はそれを使用し、それ以外の場合はデフォルトで 3600 秒 (1 時間) を使用します
        long validityDuration = (AliyunVodPlayerView.this.validTime > 0) ? validTime : 3600;
        long newExpireTime = (System.currentTimeMillis() / 1000) + validityDuration;

        // 3. 期限切れの URL から元の URL を抽出します (署名方式 A を例として使用)
        // パラメーター部分 (例: "?auth_key=") を削除して、元のリソース URL を復元します
        int authKeyIndex = expiredUrl.indexOf("?auth_key=");
        if (authKeyIndex == -1) {
            authKeyIndex = expiredUrl.indexOf("&auth_key=");
        }
        // auth_key が見つからない場合でも安全に処理できるようにします
        String originalUrl = (authKeyIndex != -1) ? expiredUrl.substring(0, authKeyIndex) : expiredUrl;

        // 4. ユーティリティクラスを使用して新しい認証済み URL を生成します
        String newAuthUrl = CdnAuthUtil.aAuth(originalUrl, authenticationKey, newExpireTime);

        // 5. 生成された認証済み URL を確認し、コールバックを介して結果を返します
        if (newAuthUrl != null && !newAuthUrl.isEmpty()) {
            Log.i(TAG, "Refresh success, new URL: " + newAuthUrl);
            // UrlSource オブジェクトを作成し、SDK の要件に従って新しい URL を設定します
            UrlSource resultSource = new UrlSource();
            resultSource.setUri(newAuthUrl);
            sourceRefreshCallback.onSuccess(resultSource);
        } else {
            Log.e(TAG, "Refresh failed: Failed to generate new authorized URL.");
            sourceRefreshCallback.onError("REFRESH_ERROR: Failed to generate new URL.");
        }
    }
});

ユーティリティ関数の補足

署名方式 A を例にとります。

ユーティリティ関数の補足

// 認証済み URL を生成する関数
private String generateAuthUrl(String uri, String key, long exp) {
    Pattern uriPattern = Pattern.compile("^(https?://)?([^/?]+)(/[^?]*)?(\\?.*)?$");
    Matcher m = uriPattern.matcher(uri);

    if (!m.matches()) {
        return null;
    }

    String scheme = (m.group(1) != null) ? m.group(1) : "http://";
    String host = m.group(2);
    String path = (m.group(3) != null) ? m.group(3) : "/";
    String args = (m.group(4) != null) ? m.group(4) : "";

    String rand = "0";
    String uid = "0";

    String sstring = String.format("%s-%d-%s-%s-%s", path, exp, rand, uid, key);
    String hashvalue = md5sum(sstring);
    String authKey = String.format("%d-%s-%s-%s", exp, rand, uid, hashvalue);

    if (!args.isEmpty()) {
        return String.format("%s%s%s%s&auth_key=%s", scheme, host, path, args, authKey);
    } else {
        return String.format("%s%s%s%s?auth_key=%s", scheme, host, path, args, authKey);
    }
}

// MD5 を計算するユーティリティ関数
private String md5sum(String src) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(src.getBytes(StandardCharsets.UTF_8));
        byte[] digest = md.digest();

        StringBuilder hexString = new StringBuilder();
        for (byte b : digest) {
            hexString.append(String.format("%02x", b));
        }
        return hexString.toString();
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("MD5 algorithm not found", e);
    }
}

バインドされたネットワークインターフェースコントローラー (NIC) の切り替え

ApsaraVideo Player SDK for Android は、AliPlayerGlobalSettings.enableSwitchNIC メソッドを提供し、ネットワーク異常時に NIC を自動的に切り替えて、安定したリソース再生を保証します。サンプルコード:

説明

このメソッドは、スイッチが有効で、複数の NIC が存在する場合にのみ有効です。

AliPlayerGlobalSettings.enableSwitchNIC(true);

パフォーマンス

再生シーンの設定

再生シーンを設定すると、シーンに基づいて最適なパラメーター (バッファ設定や機能スイッチを含む) が自動的に構成されます。setConfig インターフェイスを介して設定されたカスタムパラメーターは有効なままです (カスタム設定が優先されます)。

説明
  • 再生シーンを設定した後、getConfig インターフェイスを呼び出してパラメーター構成を表示できます。

インターフェイスの例

/**
 * プレーヤーシーンを設定します。
 *
 * @param scene. 
 */
/****
 * プレーヤーシーンを設定します。
 *
 * @param scene. 
 */
abstract public void setPlayerScene(PlayerScene scene);

再生シーン

public enum PlayerScene {
    /**
     * シーン: なし
     */
    /****
     * シーンなし
     */
    NONE,
    /**
     * 長編動画シーン: 30 分以上の動画に適用
     */
    /****
     * 長編シーン: 30 分以上に適用
     */
    LONG,
    /**
     * 中編動画シーン: 5 分から 30 分の動画に適用
     */
    /****
     * 中編シーン: 5 分から 30 分に適用
     */
    MEDIUM,
    /**
     * 短編動画シーン: 5 分までの動画に適用
     */
    /****
     * 短編シーン: 0 秒から 5 分に適用
     */
    SHORT,
    /**
     * ライブストリーミングシーン
     */
    /****
     * ライブシーン
     */
    LIVE,
    /**
     * 超低遅延ライブストリーミングシーン
     */
    /****
     * RTS ライブシーン
     */
    RTS_LIVE
}

使用上の注意

// 短編動画シーンを設定
aliPlayer.setPlayerScene(PlayerScene.SHORT)

// 中編動画シーンを設定
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)

// 長編動画シーンを設定
aliPlayer.setPlayerScene(PlayerScene.LONG)

// ライブストリーミングシーンを設定
aliPlayer.setPlayerScene(PlayerScene.LIVE)

プリレンダリング

ApsaraVideo Player SDK for Android は、再生開始前に最初のフレームをプリレンダリングすることをサポートしています。これにより、起動読み込み時間が改善されます。

説明
  1. この機能はデフォルトで無効になっています。

  2. 準備後にフレームが View に迅速にレンダリングされるように、Prepare を呼び出す前に View を設定する必要があります。

  3. この機能を有効にすると、準備完了と最初のフレームのレンダリングイベントのトリガー順序が変わります。この機能を有効にしない場合、最初に準備完了がトリガーされ、次に最初のフレームのレンダリングがトリガーされます。この機能を有効にすると、デコードとレンダリングの速度の違いにより、準備完了の前に最初のフレームのレンダリングがトリガーされる場合があります。これは再生には影響しません。

以下に例を示します。

aliPlayer.setOption(ALLOW_PRE_RENDER, 1);

ローカルキャッシュ

説明

詳細なコード例については、API-Example動画プリロード (Preload) モジュールをご参照ください。このプロジェクトは、Java で書かれた ApsaraVideo Player SDK の Android サンプルプロジェクトであり、開発者がコア SDK の統合を迅速に習得するのに役立ちます。

ApsaraVideo Player SDK for Android を使用すると、再生中に動画をキャッシュできます。これにより、起動読み込み時間が短縮され、シークプロセスが高速化され、再生レイテンシーが短縮され、ループ再生中のトラフィック消費が削減されます。

ローカルキャッシュの有効化

ローカルキャッシュ機能はデフォルトで無効になっています。使用するには、手動で有効にする必要があります。これは AliPlayerGlobalSettingsenableLocalCache によって制御されます。以下に例を示します。

コードの表示

// ローカルキャッシュを有効にします (デフォルトパス)
AliPlayerGlobalSettings.enableLocalCache(true, this);

/**
 *  次のコードを使用してキャッシュを設定することもできます。
 *  ローカルキャッシュを有効にします。この機能が有効になると、メディアファイルがデバイスにキャッシュされます。 
 *  @param enable: ローカルキャッシュ機能を有効にするかどうかを指定します。有効な値: true と false。true はローカルキャッシュ機能が有効であることを示し、false はローカルキャッシュ機能が無効であることを示します。デフォルト値: false。 
 *  @param maxBufferMemoryKB: このパラメーターは V5.4.7.1 以降では非推奨です。
 *  @param localCacheDir: 必須。キャッシュされたファイルのディレクトリ。絶対パスです。 
 *  AliPlayerGlobalSettings.enableLocalCache(enable, maxBufferMemoryKB, localCacheDir);
 */

/**
 * キャッシュされたファイルをクリアするための設定を構成します。 
 * @param expireMin - このパラメーターは V5.4.7.1 以降では非推奨です。 
 * @param maxCapacityMB - キャッシュされたデータの最大サイズ。単位:MB。デフォルトでは、キャッシュされたデータの最大サイズは 20 GB です。指定された最大サイズを超えた場合、システムはキャッシュされたファイルのキャッシュ時間に基づいて、キャッシュされたデータのサイズが指定された最大サイズ以下になるまでファイルを削除します。このプロセス中、システムは最も古いキャッシュファイルを優先的に削除します。 
 * @param freeStorageMB - ディスクの最小空き領域。単位:MB。デフォルト値:0。ディスクのアイドル領域が指定された最小領域より小さい場合、システムはキャッシュされたファイルのキャッシュ時間に基づいて、ディスクのアイドル領域が指定された最小領域以上になるまでファイルを削除します。このプロセス中、システムは最も古いキャッシュファイルを優先的に削除します。 
 * public static void setCacheFileClearConfig(long expireMin,
 *         long maxCapacityMB,
 *         long freeStorageMB)
 */

 /**
  * ビデオファイルの URL ハッシュ値のコールバックを構成します。コールバックを構成しない場合、SDK は MD5 アルゴリズムを使用して URL ハッシュ値を計算します。 
  * public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
  */
説明
  • ビデオファイルの再生 URL に認証パラメーターが含まれている場合、ビデオファイルのローカルキャッシュおよび再生中に認証パラメーターの値が変更されます。setCacheUrlHashCallback オペレーションを呼び出して、認証パラメーターを削除した後に MD5 ハッシュ値を計算できます。例えば、http://****.mp4?aaa は認証パラメーターを含むビデオファイルの再生 URL です。この場合、ビデオファイルのロード時に URL http://****.mp4 を使用して MD5 ハッシュ値が計算されます。ただし、暗号化された M3U8 ビデオのキー URL で認証パラメーターを削除した後に MD5 ハッシュ値を計算すると、同じキー URL によって異なるビデオがヒットするため、再生が失敗します。解決策:再生 URL http(s)://xxxxx.m3u8?aaaa からのみ認証パラメーターを削除し、setCacheUrlHashCallback コールバックのキー URL http(s)://yyyyy?bbbb からは削除しないでください。进阶功能-本地缓存.png

  • サーバーが HTTP と HTTPS の両方で同じメディアファイルを提供する場合、ハッシュ値を計算する前にリクエストヘッダーを削除または標準化できます。例えば:

    • ビデオファイルの再生 URL が https://****.mp4http://****.mp4 の場合、ビデオファイルのロード時に ****.mp4 を使用して MD5 ハッシュ値が計算されます。

    • ビデオファイルの再生 URL が https://****.mp4 の場合、ビデオファイルのロード時に URL http://****.mp4 を使用して MD5 ハッシュ値が計算されます。

  • ApsaraVideo Player SDK V5.5.4.0 以降で、再生 URL に認証パラメーターが含まれる HLS ストリームを再生する場合、PlayerConfig.mEnableStrictAuthMode を設定して認証モードを指定します。古いバージョンでは、デフォルト値は false です。V7.13.0 以降では、デフォルト値は true です。

    • false:認証情報をキャッシュします。ビデオが完全にキャッシュされていない場合、キャッシュされていないビデオコンテンツを再生するときに、プレーヤーはキャッシュされた認証情報を使用して URL 署名リクエストを送信します。署名付き URL の有効期間が短い場合、または長時間の一時停止後に再生を再開した場合、認証が期限切れになる可能性があります。この場合、再生ソースの自動更新機能を統合して、認証の期限切れを処理します。

    • 厳格な認証 (true):認証はキャッシュされず、再生開始ごとに実行されます。ネットワーク接続がない場合、再生は失敗します。

単一 URL のローカルキャッシュの有効化または無効化

player config で単一 URL のローカルキャッシュを有効または無効にできます。

// 構成情報を取得します。
PlayerConfig config = aliPlayer.getConfig();
// 再生 URL のローカルキャッシュを有効にするかどうかを構成します。デフォルト値:true。URL のローカルキャッシュは、AliPlayerGlobalSettings でローカルキャッシュが有効になっており、このパラメーターの値が true の場合にのみ有効になります。このパラメーターの値が false の場合、URL のローカルキャッシュは無効になります。 
config.mEnableLocalCache = false;
....// 他の設定を構成します。

// プレーヤーの設定を構成します。
aliPlayer.setConfig(config);

プリロード

ApsaraVideo Player SDK for Android は、ローカルキャッシュ機能のアップグレードであるビデオプリロードをサポートしています。ビデオプリロード機能を使用すると、キャッシュされたビデオが占有できるメモリの最大サイズを指定できます。これにより、起動読み込み時間が短縮されます。

次の制限があります。

  • 一度にプリロードできるのは、MP4、MP3、FLV、または HLS ファイル 1 つだけです。

説明

デフォルトでは、ApsaraVideo Player SDK for Android を使用してビデオをプリロードすると、ネットワークリソーススケジューリングが有効になります。これにより、再生中のビデオの品質が保証されます。ネットワークリソーススケジューリングが有効な場合、プリロードリクエストは、再生中のビデオのバッファされたコンテンツが特定の制限に達した後にのみ送信されます。リアルタイムのプリロードリクエストを管理したい場合は、ネットワークリソーススケジューリングを無効にできます。

AliPlayerGlobalSettings.enableNetworkBalance(false);
  1. ローカルキャッシュ機能を有効にします。詳細については、「ローカルキャッシュの設定」をご参照ください。

  2. データソースを設定します。

    VidAuth (推奨)

    VidAuth vidAuth = new VidAuth();
    vidAuth.setVid("Vid 情報");// 必須。ビデオの ID。 
    vidAuth.setPlayAuth("<yourPlayAuth>");// 必須。再生認証情報。GetVideoPlayAuth を呼び出して生成されます。 
    vidAuth.setRegion("アクセスリージョン");// Player SDK V5.5.5.0 以降では、このパラメーターは非推奨です。プレーヤーはリージョン情報を自動的に解析します。Player SDK V5.5.5.0 以前では、このパラメーターは必須です。このパラメーターには、ApsaraVideo VOD が有効化されているリージョンの ID を指定します。デフォルト値:cn-shanghai。 
    vidAuth.setQuality("選択された解像度") //"AUTO" はアダプティブビットレートを示します

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Vid 情報");// 必須。ビデオの ID。 vidSts.setAccessKeyId("<yourAccessKeyId>");// 必須。一時的な STS トークンが発行されたときに生成される AccessKey ID。AccessKey ID を生成するには、STS の AssumeRole オペレーションを呼び出します。  vidSts.setAccessKeySecret("<yourAccessKeySecret>");// 必須。一時的な STS トークンが発行されたときに生成される AccessKey Secret。AccessKey Secret を生成するには、STS の AssumeRole オペレーションを呼び出します。  vidSts.setSecurityToken("<yourSecurityToken>");// 必須。STS トークン。STS トークンを取得するには、STS の AssumeRole オペレーションを呼び出します。  vidSts.setRegion("アクセスリージョン");// 必須。ApsaraVideo VOD が有効化されているリージョン。デフォルト値:cn-shanghai。
    vidSts.setQuality("選択された解像度") //"AUTO" はアダプティブビットレートを示します

    UrlSource

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("再生 URL");// 必須。再生 URL は、ApsaraVideo VOD またはサードパーティのビデオオンデマンド (VOD) プラットフォーム上の音声ファイルまたはビデオファイルの URL にすることができます。
  3. タスクパラメーターを設定します。

    説明

    これはマルチビットレート動画にのみ適用されます。setDefaultBandWidthsetDefaultResolutionsetDefaultQuality のいずれかを選択してください。

    PreloadConfig preloadConfig = new PreloadConfig();
    // マルチビットレートストリームのビットレートを設定します
    preloadConfig.setDefaultBandWidth(400000);
    // マルチビットレートストリームの解像度を設定します
    preloadConfig.setDefaultResolution(640 * 480);
    // マルチビットレートストリームの品質を設定します
    preloadConfig.setDefaultQuality("FD");
    // プリロード時間を設定します
    preloadConfig.setDuration(1000);
  4. タスクリスナーを追加します。

    コードの表示

    /**
     * プリロードリスナーの実装
     */
    private static class PreloadListenerImpl extends OnPreloadListener {
    
        @Override
        public void onError(@NonNull String taskId, @NonNull String urlOrVid, @NonNull ErrorInfo errorInfo) {
            // ロード失敗
        }
    
        @Override
        public void onCompleted(@NonNull String taskId, @NonNull String urlOrVid) {
            // ロード完了
        }
    
        @Override
        public void onCanceled(@NonNull String taskId, @NonNull String urlOrVid) {
           // ロードキャンセル
        }
    }
  5. タスクをビルドし、MediaLoaderV2 インスタンスに追加してプリロードを開始します。

    VidAuth (推奨)

    // プリロードタスクをビルドします
    PreloadTask mPreloadTask = new PreloadTask(vidAuth, preloadConfig);
    // MediaLoaderV2 インスタンスを取得します
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // タスクを追加してプリロードを開始します
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)

    VidSts

    // プリロードタスクをビルドします
    PreloadTask mPreloadTask = new PreloadTask(vidSts, preloadConfig);
    // MediaLoaderV2 インスタンスを取得します
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // タスクを追加してプリロードを開始します
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl);

    UrlSource

    // プリロードタスクをビルドします
    PreloadTask mPreloadTask = new PreloadTask(urlSource, preloadConfig);
    // MediaLoaderV2 インスタンスを取得します
    MediaLoaderV2 mediaLoaderV2 = MediaLoaderV2.getInstance();
    // タスクを追加してプリロードを開始します
    String taskId = mediaLoaderV2.addTask(mPreloadTask, PreloadListenerImpl)
  6. オプション:タスクを管理します。

    mediaLoaderV2.cancelTask(taskId);// 指定されたタスク ID のプリロードタスクをキャンセルします
    mediaLoaderV2.pauseTask(taskId);// 指定されたタスク ID のプリロードタスクを一時停止します
    mediaLoaderV2.resumeTask(taskId);// 指定されたタスク ID のプリロードタスクを再開します
  7. オプション:ロードされたファイルを削除します。

    ロードされたファイルを削除してスペースを節約できます。ApsaraVideo Player SDK for Android は、ロードされたファイルを削除するメソッドを提供していません。アプリケーション内の対応するディレクトリでファイルを削除する必要があります。

動的プリロード

動的プリロード機能を使用すると、再生中のビデオとプリロードされたビデオのキャッシュを管理できます。また、プリロードされるビデオの数を制御することもできます。これにより、再生エクスペリエンスとコストのバランスを維持できます。

コードの表示

// 推奨構成と動的プリロードを有効にします
aliListPlayer.setPreloadScene(IListPlayer.SceneType.SCENE_SHORT);

// ベースラインのプリロード時間を構成します
// プリロード時間を 1,000 ミリ秒に設定します
PreloadConfig config = new PreloadConfig();
config.mPreloadDuration = 1000;
aliListPlayer.updatePreloadConfig(config);

// プリロードするビデオの数を構成します。前方および後方プリロードがサポートされています。
// 1 は前方にプリロードするビデオの数を指定します。3 は後方にプリロードするビデオの数を指定します。
aliListPlayer.setPreloadCount(1, 3);

// 動的プリロードの減少オフセットを構成します
aliListPlayer.enablePreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, true);
aliListPlayer.setPreloadStrategy(IListPlayer.StrategyType.STRATEGY_DYNAMIC_PRELOAD_DURATION, "{\"algorithm\": \"sub\",\"offset\": \"200\"}");

マルチビットレート HLS 動画のプリロード

マルチビットレート HLS 動画の再生中に listPlayer メソッドを呼び出す際に、現在のビデオストリームと同じ解像度の動画をプリロードできます。必要に応じて、さまざまなプリロードモードを使用できます。

サポートされているプリロードパターンを展開して表示

  /**
   * 再生とプリロードのデフォルトビットレート。
   */
  /****
   * デフォルトモード、ストリームのデフォルトビットレートを再生およびプリロードします
   */
  MultiBitratesMode_Default(0),

  /**
   * 最初のフレームのパフォーマンスが優先されるプリロードモード。この場合、プリロードされたビデオがデフォルトで再生されます。
   */
  /****
   * 最初のフレームコスト (FC) 優先、最初のフレームコストを削減します。プリロードされた hls ストリームのビットレートのみを再生します。
   */
  MultiBitratesMode_FCPrio(1),

  /**
   * 最初のフレームのパフォーマンスと再生のスムーズさが同じ優先度を持つプリロードモード。この場合、moveToNext メソッドを呼び出してビデオを切り替える前後で同じビットレートが使用されます。
   */
  /****
   * 最初のフレームと再生のスムーズさ、moveToNext の前後で同じビットレートを再生します
   */
  MultiBitratesMode_FC_AND_SMOOTH(2),

  /**
   * 再生のスムーズさが優先されるプリロードモード。この場合、前のビデオのビットレートがデフォルトで使用されます。
   */
  /****
   * 再生のスムーズさ優先、moveToNext の前後で同じビットレートを再生します。
   */
  MultiBitratesMode_SmoothPrio(3);

統合コードの表示

// マルチビットレートプリロードモードを指定します。
aliListPlayer.SetMultiBitratesMode(preLoadMode);


// オプション。開始ビットレートを設定します。
aliListPlayer.setDefaultBandWidth(defaultBandWidth)


// オプション。onPrepared コールバックで、abr モードを指定します。
aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
    @Override
    public void onPrepared() {
        //abr は multiBitrate m3u8 にのみ影響します
        aliListPlayer.selectTrack(-1);
    }
});

ダウンロード速度の取得

ApsaraVideo Player SDK for Android は、指定されたビデオのダウンロード速度をクエリするための getExtraValue メソッドを提供します。onInfo コールバックが呼び出されてクエリ結果が取得されます。サンプルコード:

aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
    @Override
    public void onInfo(InfoBean infoBean) {
        if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
            // ダウンロード速度。
            long extraValue = infoBean.getExtraValue();
        }
    }
});

ネットワーク属性

HTTPDNS

HTTPDNS 機能は、DNS 解決技術を使用して、特定の HTTPDNS サーバーにドメイン名解決リクエストを送信し、解決結果を迅速かつ安定して取得します。これにより、DNS ハイジャックを防ぎます。

ApsaraVideo Player SDK は、Alibaba Cloud CDN によって高速化されたドメイン名に対して HTTPDNS サービスを提供します。拡張 HTTPDNS 機能を使用して、正確なスケジューリングを実装し、リアルタイムのドメイン解決結果がすぐに有効になるようにすることができます。これにより、ネットワークパフォーマンスが向上します。

拡張 HTTPDNS 機能を使用するためのサンプルコード

拡張 HTTPDNS 機能は、高速化ドメイン名に対してのみ使用できます。この機能を使用する前に、高速化ドメイン名が追加および設定されていることを確認してください。ApsaraVideo VOD で CDN のドメイン名を追加および設定する方法の詳細については、「高速化ドメイン名の追加」をご参照ください。高速化ドメイン名の詳細については、「Alibaba Cloud CDN とは」をご参照ください。

// 拡張 HTTPDNS 機能を有効にします。
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// オプション。HTTPDNS 事前解決ドメイン名を追加します。
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");

HTTP/2

説明

デフォルトでは、ApsaraVideo Player SDK for Android V5.5.0.0 以降で HTTP/2 が有効になっています。

ApsaraVideo Player SDK for Android は HTTP/2 をサポートしています。HTTP/2 を有効にしてリクエストの多重化を実装できます。これにより、ヘッドオブライン (HOL) ブロッキングを防ぎ、再生パフォーマンスを向上させます。サンプルコード:

AliPlayerGlobalSettings.setUseHttp2(true);

HTTP 経由での再生リクエスト開始前の TCP 接続の作成

HTTP 経由で再生リクエストを開始する前に、伝送制御プロトコル (TCP) 接続を作成できます。これにより、待機時間が短縮され、ビデオ再生の適時性と一貫性が確保され、ユーザーエクスペリエンスが向上し、ネットワークとシステムリソースの使用が最適化されます。サンプルコード:

// domain パラメーターを host[:port] 形式で指定します。複数のドメイン名はセミコロン (;) で区切ります。port パラメーターはオプションです。
// グローバルに構成します。
// TCP 接続を追加または削除します。空の文字列を指定した場合、TCP 接続は作成されません。
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

動画のダウンロード

説明

詳細なコード例については、API-Example動画のダウンロードとオフライン再生 (Download) モジュールをご参照ください。このプロジェクトは、Java で書かれた ApsaraVideo Player SDK の Android サンプルプロジェクトであり、開発者がコア SDK の統合を迅速に習得するのに役立ちます。

ApsaraVideo Player SDK for Android を使用すると、動画をローカルデバイスにダウンロードして、ApsaraVideo Player でオフライン再生できます。通常ダウンロードモードとセキュアダウンロードモードがサポートされています。

  • 通常ダウンロード

    通常ダウンロードモードでダウンロードされた動画は、Alibaba Cloud によって暗号化されておらず、サードパーティ製プレーヤーで再生できます。

  • セキュアダウンロード

    セキュアダウンロードモードでダウンロードされた動画は、Alibaba Cloud によって暗号化されます。ダウンロードした動画をサードパーティ製プレーヤーで再生することはできません。ApsaraVideo Player でのみ再生できます。

使用上の注意

  • VidSts または VidAuth に基づいて再生される動画のみをダウンロードできます。

  • 動画ダウンロード機能を使用するには、ApsaraVideo VOD コンソールで機能を有効にし、ダウンロードモードを設定する必要があります。詳細については、「オフラインダウンロード」をご参照ください。

  • 動画のダウンロードを再開できます。

操作手順

  1. オプション。 暗号化検証用のセキュリティファイルを設定します。セキュリティファイルは、セキュアダウンロードモードを使用する場合にのみ設定する必要があります。

    説明

    暗号化検証用のセキュリティファイルの情報がアプリケーション情報と一致していることを確認してください。そうでない場合、動画のダウンロードは失敗します。

    セキュアダウンロードモードを使用する場合、ApsaraVideo VOD コンソールで生成されたキーファイルを Player SDK に設定する必要があります。キーファイルは、ダウンロードおよび再生用のビデオを復号化および検証するために使用されます。キーファイルの生成方法の詳細については、「ダウンロード設定の構成」トピックの「セキュアダウンロードの有効化」セクションをご参照ください。

    この設定は、アプリケーションで一度だけ構成することを推奨します。次の例は、その方法を示しています。

    PrivateService.initService(getApplicationContext(),  "encryptedApp.dat ファイルが保存されているパス"); // encryptedApp.dat ファイルを携帯電話に保存し、このパラメーターをファイルが保存されているパスに設定することを推奨します。
  2. 動画ダウンローダーの作成と設定

    AliDownloaderFactory を使用してダウンローダーを作成します。サンプルコード:

    AliMediaDownloader mAliDownloader = null;
    ......
    // ダウンローダーを作成します。
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    // ダウンロードしたファイルを保存するパスを設定します。
    mAliDownloader.setSaveDir("ストレージパス");
  3. リスナーの設定

    ダウンローダーは複数のリスナーを提供します。サンプルコード:

    コードの表示

    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           // ダウンロードするコンテンツの準備をリッスンします。
       }
    });
    mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() {
       @Override
       public void onDownloadingProgress(int percent) {
           // ダウンロード進捗のパーセンテージをリッスンします。
       }
       @Override
       public void onProcessingProgress(int percent) {
           // 処理進捗のパーセンテージをリッスンします。
       }
    });
    mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() {
       @Override
       public void onError(ErrorInfo errorInfo) {
           // ダウンロードエラーをリッスンします。
       }
    });
    mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() {
       @Override
       public void onCompletion() {
           // ダウンロード成功をリッスンします。
       }
    });
  4. ダウンロードソースの準備

    prepare メソッドを呼び出してダウンロードソースを準備できます。VidSts および VidAuth ソースがサポートされています。サンプルコード:

    • VidSts

      // VidSts インスタンスを作成します。
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("Vid 情報"); // ビデオ ID (VideoId)。
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // 一時的な STS AccessKey ペアの AccessKey ID。Security Token Service (STS) の AssumeRole オペレーションを呼び出して生成する必要があります。
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // 一時的な STS AccessKey ペアの AccessKey Secret。Security Token Service (STS) の AssumeRole オペレーションを呼び出して生成する必要があります。
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // Security Token Service (STS) トークン。Security Token Service (STS) の AssumeRole オペレーションを呼び出して生成する必要があります。
      aliyunVidSts.setRegion("ビデオオンデマンドサービスがデプロイされているリージョン"); // ビデオオンデマンドサービスがデプロイされているリージョン。デフォルト値:cn-shanghai。
      // VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にしており、デフォルトのパラメーター名が MtsHlsUriToken の場合、VidPlayerConfigGen を設定して vid に渡す必要があります。詳細については、次の例をご参照ください。
      // VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にしていない場合、次のコードを統合する必要はありません。
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      aliyunVidSts.setPlayerConfig(vidConfig);
      
      // ダウンロードソースを準備します。
      mAliDownloader.prepare(aliyunVidSts);
    • VidAuth

      // VidAuth ダウンロードソースを作成します。
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("動画 ID"); // 動画 ID。
      vidAuth.setPlayAuth("<yourPlayAuth>");// 再生認証情報(GetVideoPlayAuth を呼び出して生成されます)。
      vidAuth.setRegion("アクセスリージョン"); // このパラメーターは、ApsaraVideo Player SDK V5.5.5.0 以降では非推奨です。ApsaraVideo Player SDK V5.5.5.0 以降を使用する場合、プレーヤーが自動的にリージョン情報を解析します。ApsaraVideo Player SDK V5.5.5.0 より前のバージョンを使用する場合、このパラメーターは必須です。このパラメーターには、ApsaraVideo VOD が有効化されているリージョンの ID を指定します。デフォルト値:cn-shanghai。
      // ApsaraVideo VOD コンソールで HLS 暗号化のパラメーターのパススルーを有効化し、デフォルトのパラメーター名が MtsHlsUriToken である場合、config パラメーターを設定して VID に渡す必要があります。詳細については、以下のコードをご参照ください。
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(config);
      // ダウンロードソースを準備します。
      mAliDownloader.prepare(vidAuth);
    説明
    • 出力ファイルと入力ファイルは同じ形式であり、変更できません。

    • ApsaraVideo VOD コンソールで HLS 暗号化のパラメーターパススルーを有効にすると、デフォルトのパラメーターは MtsHIsUriToken になります。詳細については、「HLS 暗号化のパラメーターパススルー」をご参照ください。次に、前述のコードに従って MtsHIsUriToken の値を ApsaraVideo VOD ソースに設定します。

  5. 準備が成功した後、ダウンロードする項目を選択してダウンロードを開始します。

    準備が成功すると、OnPreparedListener コールバックが呼び出されます。TrackInfo オブジェクトには、ビデオ解像度などの情報が含まれています。ダウンロードするトラックを選択します。サンプルコード:

    public void onPrepared(MediaInfo mediaInfo) {
        // 準備が成功しました。
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        // 例えば、最初のトラックをダウンロードします。
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
        // ダウンロードを開始します。
        mAliDownloader.start();
    }
  6. (オプション) ダウンロードソースの更新

    VidSts または VidAuth ソースは、ダウンロード前に期限切れになる可能性があります。そのため、ダウンロードを開始する前にダウンロードソースを更新することを推奨します。サンプルコード:

    // ダウンロードソースを更新します。
    mAliDownloader.updateSource(VidSts);
    // ダウンロードを開始します。
    mAliDownloader.start();
  7. ダウンロードが成功または失敗した後、ダウンローダーを解放します。

    ダウンロードが成功した後、onCompletion または onError コールバックを呼び出して、release を呼び出してダウンローダーを解放します。サンプルコード:

    mAliDownloader.stop();
    mAliDownloader.release();
  8. オプション。 ダウンロードしたファイルの削除

    ダウンロード中またはダウンロード完了後に、ダウンロードしたファイルを削除できます。サンプルコード:

    // ダウンローダーオブジェクトを介してファイルを削除します。
    mAliDownloader.deleteFile();
    // 静的メソッドを介してファイルを削除します。成功した場合は 0 を返します。
    AliDownloaderFactory.deleteFile("ダウンロードされたフォルダのパス","ビデオ ID","ビデオ形式","ダウンロードされたビデオのインデックス");

次のステップ

ApsaraVideo Player を使用して、ダウンロードしたビデオを再生できます。次の手順を実行します。

  1. ダウンロードが完了したら、ビデオファイルの絶対パスを取得します。

    String path = mAliDownloader.getFilePath();
  2. ダウンロードしたビデオファイルの絶対パスを再生用の URL ソースとして設定します。

     UrlSource urlSource = new UrlSource();
            urlSource.setUri("再生 URL");// ダウンロードしたビデオファイルの絶対パスを設定します。 
            aliPlayer.setDataSource(urlSource);

暗号化された動画の再生

ApsaraVideo Player SDK for Android を使用すると、HLS 暗号化、Alibaba Cloud 独自の暗号化、またはデジタル著作権管理 (DRM) 暗号化に基づいて暗号化されたオンデマンド動画を再生できます。SDK では、DRM 暗号化に基づいて暗号化されたライブストリームのみを再生できます。暗号化された動画の再生方法の詳細については、「暗号化されたビデオの再生」をご参照ください。

ネイティブ RTS 再生

Android Player SDK は、ネイティブ RTS SDK を統合して、リアルタイムストリーミング (RTS) 機能をネイティブに実装します。詳細については、「Android での RTS ストリームフェッチングの実装」をご参照ください。

参考情報