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

ApsaraVideo VOD:高度な機能

最終更新日:Feb 12, 2026

このトピックでは、ApsaraVideo Player SDK for Android の高度な機能の使用方法について説明し、コード例を提供します。その他の機能の詳細については、「API リファレンス」をご参照ください。

重要

デモを実行するには、ダウンロードして、「デモの実行」の手順に従ってプロジェクトをコンパイルおよび実行してください。

専門能力を確認する

説明

ApsaraVideo Player の一部の機能には Professional Edition のライセンスが必要です。詳細については、「ApsaraVideo Player SDK の機能」をご参照ください。これらの機能を使用するには、Professional Edition のライセンスを取得する必要があります。詳細については、「ApsaraVideo Player SDK のライセンス取得」をご参照ください。

アプリケーション起動時またはプレーヤー API を呼び出す前にリスナーを設定します。

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");  // traceId はデバイスまたはユーザーの一意な識別子で、通常 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. プリロードする動画数を設定します。

    適切な動画のプリロード数を設定することで、起動速度を効果的に向上させられます。サンプルコード:

    // プリロードする動画数を設定します。読み込まれる動画の総数は 1 + count × 2 です。
    aliListPlayer.setPreloadCount(int count);
  4. 複数の再生ソースを追加または削除します。

    リスト再生は、Vid (VidSts および VidPlayAuth を含む) と UrlSource の 2 種類の再生ソースをサポートしています。Url は動画の再生 URL です。サンプルコード:

    • Url:再生 URL はサードパーティの VOD URL または ApsaraVideo VOD の再生 URL です。ApsaraVideo VOD から再生 URL を取得するには、GetPlayInfo 操作を呼び出します。再生 URL の取得を簡略化するために、ApsaraVideo VOD サーバーサイド SDK を統合することを推奨します。API を呼び出して再生 URL を取得する例については、「OpenAPI Explorer」をご参照ください。

    • Vid:音声または動画 ID です。ApsaraVideo VOD コンソール (パス:メディアファイル > 音声/動画) を使用して音声または動画ファイルをアップロードした後、または SearchMedia 操作を呼び出した後に取得できます。

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

    uid は動画の一意な識別子であり、動画を区別するために使用されます。uid が同じ場合、動画は同一とみなされます。再生中に混合ストリームが発生した場合は、異なるインターフェイスで同じ uid が設定されていないか確認してください。uid にはフォーマット制限がなく、任意の文字列を使用できます。

  5. 表示ビューを設定します。

    プレーヤーは 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 用の API を使用します。
    aliPlayer.moveTo(String uid);
    // VID 用の API を使用します。事前に取得した一時的な STS 認証情報および AccessKey ペアである stsInfo を渡す必要があります。詳細については、「RAM ロールの作成および STS を使用した一時アクセス権限の付与」をご参照ください。
    aliPlayer.moveTo(String uid, StsInfo info);
  7. 前の動画または次の動画を再生します。

    • moveTo を呼び出して動画ソースを再生した後、moveToPrev および moveToNext API を呼び出して、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 はアルファチャネルのレンダリングをサポートしており、透明度付きのダイナミックギフトエフェクトを再生できます。ライブチャンネルなどのシナリオでは、透明度付きのダイナミックギフトエフェクトを再生してもライブコンテンツが遮られず、ユーザーの視聴およびインタラクティブ体験が大幅に向上します。

制限事項

ApsaraVideo MediaBox SDK V6.8.0 以降および ApsaraVideo Player SDK V6.9.0 以降で、透明度レンダリングがサポートされています。

メリット

透明度情報を含む MP4 動画をギフトエフェクトとして使用することで、アニメーション品質の向上、ファイルサイズの小型化、互換性の向上、開発効率の向上が実現します。これにより、ギフトエフェクトをユーザーにより良く表示でき、ユーザーエクスペリエンスが向上します。

  1. アニメーション品質の向上:MP4 動画は元のアニメーション品質(詳細や色を含む)を保持できます。APNG や IXD などの他のフォーマットと比較して、MP4 はデザイナーが作成したアニメーションエフェクトをより正確に再現できます。

  2. ファイルサイズの小型化:MP4 動画ファイルは、APNG や IXD などの他のフォーマットよりも効率的に圧縮できます。これにより、読み込み速度が向上し、ネットワーク帯域幅の消費が削減されます。

  3. 互換性の向上:MP4 は汎用的な動画フォーマットであり、さまざまなデバイスおよびブラウザで広くサポートされています。主流のデバイスでギフトエフェクトの再生および表示が可能です。

  4. 開発効率の向上:MP4 動画をギフトエフェクトとして使用する技術ソリューションは比較的シンプルです。開発者は複雑な解析およびレンダリングロジックを研究および実装する必要がなく、他の機能の実装に集中して開発効率を向上させられます。

サンプルコード

以下の API が追加されました:アルファモードを設定します(動画素材内のアルファチャネルの位置:上、下、左、右)。デフォルト値は None です。

説明
  • 素材内のアルファチャネルの位置は、setAlphaRenderMode パラメーターの設定と一致している必要があります。

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

/**
 * アルファレンダリングモードを設定します。
 *
 * @param alphaRenderMode 指定されたアルファレンダリングモード。{@link AlphaRenderMode} を参照。
 */
abstract public void setAlphaRenderMode(AlphaRenderMode alphaRenderMode);
//--------------View の使用方法-------------
// View を透明にする必要があります。
//TextureView
TextureView aliplayerView; // 再生に使用するビュー。
aliplayerView.setOpaque(false);

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

//-----------AliPlayer の使用方法-----------
// アルファモードを設定します。
aliPlayer.setAlphaRenderMode(IPlayer.AlphaRenderMode.RENDER_MODE_ALPHA_AT_RIGHT);
// アルファモードに対応する素材を設定します。
UrlSource urlSource = new UrlSource();
urlSource.setUri("https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/business_requirement_sample/alpha_channel/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 for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。

ApsaraVideo Player SDK for Android は、外部字幕の追加および切り替えをサポートしています。現在、SRT、SSA、ASS、VTT 形式の字幕をサポートしています。

以下に例を示します。

  1. 字幕を表示するビューを作成します。

    字幕フォーマットごとに異なるビューを作成します。

    コード表示

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

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

    // プレーヤー V7.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) {
                }
            }
        );

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

VttSubtitleView および WebVttResolver をベースに、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.0533 倍です。
          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. 字幕ビューを初期化します。

      // 字幕ビューを初期化します。
      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);
              }
          }
      });

音声のみ再生

動画再生を無効にして、音声のみの効果を実現できます。プレーヤーの準備前に 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 フォームを送信してライセンスを申請する必要があります。

  • クラウドとクライアントを組み合わせたアダプティブデコーディングの付加価値サービスには、主に次の内容が含まれます。1. クラウドベースのハードウェアデコーディング互換性データの動的配信。2. H.265 ストリームから H.264 ストリームへのアダプティブ劣化。

  • 付加価値サービスを有効にしていなくても、ハードウェアデコーディングに失敗した場合に自動的にソフトウェアデコーディングに切り替える機能は SDK に備わっています。

バックアップストリームを設定します。サンプルコード:

// アプリケーション層は、すべての元の URL とバックアップ URL のキーと値のペアを格納する Map を維持します。切り替え時に、元の URL に基づいて Map からバックアップ 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 "";
        }
    }
});

ネットワーク状況に基づくアダプティブビットレートストリーミング

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

  • ApsaraVideo VOD トランスコーディングによって生成されたアダプティブストリームの場合、Vid ベースの再生を使用する際に、デフォルトの再生画質リストを DEFINITION_AUTO として指定する必要があります。そうしないと、プレーヤーはデフォルトロジックに従って低画質の動画ストリームを選択して再生します。画質のデフォルト再生順序については、「動画が複数の画質にトランスコードされた場合、プレーヤー 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 を呼び出す前に設定しておく必要があります。以下に例を示します。

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

オプション: プレーヤーの selectTrack メソッドを呼び出して再生ビットレートをアダプティブに切り替える前に、config を通じて ABR 切り替え画質の上限を設定して、予期しないビットレートに自動的に切り替わるのを防ぐことができます。サンプルコード:(プレーヤーが prepare メソッドを呼び出す前、またはリストプレーヤーが moveTo メソッドを呼び出す前に以下のコードを呼び出すことを推奨します。)

PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; // ABR 画質上限に対応するピクセル数を 921600 (長さ × 幅 = 1280 × 720) に設定します。これにより、ABR で許可される画質のピクセル数がこの値以下になります。
aliPlayer.setConfig(config);

スナップショット

ApsaraVideo Player SDK for Android は、現在の動画のスナップショットを取得する機能を提供します。snapshot API によって実装され、生データをキャプチャして bitmap として返します。コールバックインターフェイスは OnSnapShotListener です。サンプルコード:

// スナップショットコールバックを設定します。
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // 取得した bitmap および画像の幅と高さ。
    }
});
// 現在の再生フレームのスナップショットを取得します。
aliPlayer.snapshot();

プレビュー

ApsaraVideo Player SDK for Android は、ApsaraVideo VOD サービスの設定と連携してプレビュー機能を実装できます。VidSts および VidAuth (ApsaraVideo VOD では推奨) の再生方法をサポートしています。プレビュー機能の設定および使用方法については、「動画のプレビュー」をご参照ください。

プレビュー機能を設定した後、プレーヤーのプレビュー期間を設定するために VidPlayerConfigGen.setPreviewTime() メソッドを使用します。以下は、VidSts 再生方法の例です。

VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// 20 秒プレビュー
vidSts.setPlayConfig(configGen);// 再生ソースに設定します。
...

プレビュー期間が設定されている場合、ApsaraVideo Player SDK for Android を使用して動画を再生すると、サーバーは完全な動画コンテンツを返しません。代わりに、プレビュー時間分のコンテンツを返します。

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

  • 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 の設定をサポートしています。コンソールの Referer ブラックリストおよびホワイトリストと連携して、アクセス権限を制御できます。PlayerConfig メソッドを使用してリクエストの Referer を設定します。以下は、プレーヤー SDK 設定の例です。

// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// referer を設定します (例:http://example.aliyundoc.com)。(注:referer を設定する際は、先頭にプロトコル部分を含める必要があります。)
config.mReferrer = referrer;
....// その他の設定
  // プレーヤーに設定を適用します。
aliPlayer.setConfig(config);

User-Agent の設定

ApsaraVideo Player SDK for Android は、PlayerConfig を使用してリクエスト UA を設定します。設定後、プレーヤーのリクエストには UA 情報が含まれます。サンプルコード:

// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// UA を設定します。
config.mUserAgent = "UserAgent to be set";
....// その他の設定
  // プレーヤーに設定を適用します。
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 が設定されており、ネットワークの問題により読み込み状態になった場合、NetworkRetryCount 回リトライされ、各間隔は mNetworkTimeout になります。

  • 複数回リトライしても読み込み状態が続く場合、onError イベントがコールバックされます。このとき、ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT になります。

  • NetworkRetryCount が 0 に設定されている場合、ネットワークリトライがタイムアウトすると、プレーヤーは onInfo イベントをコールバックし、イベントの InfoBean.getCode()=InfoCode.NetworkRetry になります。このとき、プレーヤーの reload メソッドを呼び出してネットワークを再読み込みするか、他のアクションを実行できます。

キャッシュおよび遅延制御の設定

ApsaraVideo Player SDK for Android は、PlayerConfig を通じてキャッシュおよび遅延を制御するインターフェイスを提供します。サンプルコード:

コード表示

// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// 最大遅延時間。注:これはライブストリーミングに有効です。遅延が大きくなると、プレーヤー SDK がフレーム同期を実行して、プレーヤーの遅延がこの範囲内に収まるようにします。
config.mMaxDelayTime = 5000;
// 最大バッファ期間。単位:ms。プレーヤーは一度に最大この量のバッファデータを読み込みます。
config.mMaxBufferDuration = 50000;
// 高バッファ期間。単位:ms。ネットワークが不安定でデータを読み込んでいる場合、読み込まれたバッファ期間がこの値に達すると、読み込み状態が終了します。
config.mHighBufferDuration = 3000;
// 開始バッファ期間。単位:ms。この時間を短く設定すると、再生がより速く開始されます。ただし、再生開始直後に読み込み状態になる可能性もあります。
config.mStartBufferDuration = 500;
....// その他の設定
// 最大後方バッファ期間。単位:ms。デフォルトは 0 です。
config.mMaxBackwardBufferDurationMs = 0;

// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);

重要
  • 3 つのバッファ期間の関係は、mStartBufferDuration ≤ mHighBufferDuration ≤ mMaxBufferDuration である必要があります。

  • 最大バッファ期間 (mMaxBufferDuration) が 5 分を超える場合、バッファが大きくなりすぎてメモリ例外が発生するのを防ぐために、システムはデフォルトで 5 分に設定します。

HTTP ヘッダーの設定

PlayerConfig メソッドを使用して、プレーヤーのリクエストに HTTP ヘッダーパラメーターを追加できます。サンプルコード:

// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ヘッダーを定義します。
String[] headers = new String[1];
headers[0]="Host:example.com";// 例:ヘッダーに Host を設定する必要があります。
// ヘッダーを設定します。
config.setCustomHeaders(headers);
....// その他の設定
  // プレーヤーに設定を適用します。
aliPlayer.setConfig(config);

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

説明

詳細なコード例については、「API-Example」の ピクチャー・イン・ピクチャー再生 (PictureInPicture) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。

手順は次のとおりです。

  1. AndroidManifest.xml ファイルで、ピクチャー・イン・ピクチャーの権限を宣言します。

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

    Rational aspectRatio = new Rational(16, 9); // PiP ウィンドウの縦横比。ビジネスニーズに応じて調整できます。
    PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
    pipBuilder.setAspectRatio(aspectRatio);
    enterPictureInPictureMode(pipBuilder.build());

    クリックイベント、アプリ離脱時、またはアプリ復帰時にピクチャー・イン・ピクチャーモードをトリガーするように選択できます。実装は次のとおりです。

    クリックイベントでトリガー

    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, "PiP モードに入ります");
        } else {
            // PiP モードから出る際の処理。
            // UI を表示します。
            Log.e(TAG, "PiP モードから出ます");
        }
    }

RTS ライブストリーミング劣化

説明

詳細なコード例については、「API-Example」の RTS 超低遅延ライブストリーミング (RtsLiveStream) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。

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

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

ApsaraVideo Player SDK for Android は、setOutputAudioChannel メソッドを使用して出力音声チャンネルを設定します。入力ソースがデュアルチャンネルの場合、以下の方法を使用して左チャンネルまたは右チャンネルに切り替えることができます。入力ソースがシングルチャンネルの場合、この設定は無効です。

説明

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

/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT は左チャンネルに切り替えて再生します。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT は右チャンネルに切り替えて再生します。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE はチャンネルを切り替えず、入力ソースのチャンネルを維持して再生します。
*/
aliPlayer.setOutputAudioChannel();

音声ストリームの解析

リスナーを設定して音声および動画ストリームデータを取得します。音声および動画は暗号化ストリームであってはならず、暗号化ストリームは解析できません。

コード表示

// オプション設定 1:基盤データのアドレスを返すかどうか。
IPlayer.RenderFrameCallbackConfig config = new IPlayer.RenderFrameCallbackConfig();
config.mVideoDataAddr = true; // 基盤の動画データアドレスのみを返すかどうか。
config.mAudioDataAddr = true; // 基盤の音声データアドレスのみを返すかどうか。
aliPlayer.setRenderFrameCallbackConfig(config);

// オプション設定 2:ハードウェアデコーディングを使用する場合、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 および使用方法は次のとおりです。

API 例

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

使用方法

// パラメーターは 8 桁の 16 進数値です。8 桁はペアになっており、順に A (アルファ透明度)、R (赤)、G (緑)、B (青) を表します。
// 例: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/en/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 のライセンスが認証されていること。詳細については、「ApsaraVideo Player SDK のライセンス取得」をご参照ください。

  3. H.266 デコーディングプラグインを搭載した ApsaraVideo Player は、Alibaba Cloud トランスコード でトランスコードされた H.266 動画の再生のみをサポートします。

プラグインの統合

プレーヤー SDK

Maven 統合 (推奨)

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

説明

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

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

ローカル統合

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

オールインワン SDK

Maven 統合

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

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

プラグインの有効化

説明

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

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

関連エラーコード

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

再生ソースの自動更新

再生ソースの自動更新機能を有効にすると、認証メカニズムによる有効期限切れによる再生中断を防げます。この機能は、ソースが無効になるとリスナーをトリガーし、新しいアドレスを取得して、動画再生を継続的かつスムーズに保ちます。

前提条件

  1. プレーヤーまたはオールインワン SDK が V7.9.0 以降であること。

  2. VidAuth ソースを使用した再生を行っているか、サービスでURL 署名が設定されていること。

VidAuth ソース

API 例

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

機能コンポーネント

機能コンポーネント

/**
 * VidAuth ソースの有効期限切れ通知のリスナー。
 * VidAuth ソースの有効期限切れ時にイベントを処理します。
 */
public interface OnVidAuthExpiredListener {

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

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

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

使用方法

音声および動画の再生認証情報は、GetVideoPlayAuth API を使用して取得できます。署名を自分で実装せずに済むように、ApsaraVideo VOD サーバーサイド SDK を統合することを推奨します。詳細については、「OpenAPI Explorer」をご参照ください。

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

        // ------------------- ユーザー実装部分開始 -------------------
        // App サーバーから新しい 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 ソース

API 例

/**
 * URL ソースの有効期限切れイベントのリスナーを設定します。
 *
 * この機能により、認証による URL の有効期限切れによる再生中断を回避するために
 * URL の更新が可能になります。リスナーがトリガーされると、URL ソースを更新し、
 * {@link SourceRefreshCallback#onSuccess} を使用して更新された URL ソースを返すことができます。
 *
 * @param listener URL ソースの有効期限切れイベントを処理するリスナー。{@link OnURLSourceExpiredListener} を参照。
 *
 * <p>URL 認証の設定方法については、
 * <a href="https://www.alibabacloud.com/help/zh/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` メソッドを
 * 呼び出すことで、更新結果を返すことができます。
 */
public interface SourceRefreshCallback<T extends SourceBase> {
    /**
     * プレーヤーが更新操作が成功したときに呼び出されます。
     *
     * @param newSource 更新された情報を持つ新しい再生ソースオブジェクト。{@link SourceBase} を参照。
     *
     * このメソッドは、更新操作が正常に完了したことを示します。開発者はこのメソッド内で
     * 新しい再生ソースを提供し、プレーヤーが最新のリソースを読み込めるようにする必要があります。
     */
    void onSuccess(T newSource);

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

/**
 * URL ソースの有効期限切れ通知のリスナー。
 * 有効期限切れのソースを処理し、再生中断を防止します。
 */
public interface OnURLSourceExpiredListener {

    /**
     * プレーヤーが URL ソース (UrlSource) の有効期限切れを検出したときに呼び出されます。
     *
     * このコールバック内で URL ソースを更新し、{@link SourceRefreshCallback#onSuccess} を使用して
     * 新しい UrlSource をプレーヤーに返すことができます。
     *
     * @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] 有効期限切れの URL を受信しました: " + expiredUrl);

        // 1. 認証キーが有効かどうかを確認します (authenticationKey がクラスメンバ変数であると仮定します)。
        if (authenticationKey == null || authenticationKey.trim().isEmpty()) {
            Log.e(TAG, "更新に失敗しました: 認証キーが空です。");
            sourceRefreshCallback.onError("REFRESH_ERROR: 認証キーがありません。");
            return; // 無効なキーのため、早期終了します。
        }

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

        // 3. 有効期限切れの URL から元の URL を抽出します (タイプ A 署名を例として使用)。
        // URL パラメーター部分 (例: "?auth_key=") を削除して、元のリソースアドレスを復元します。
        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, "更新成功、新しい URL: " + newAuthUrl);
            // SDK の要件に従い、UrlSource オブジェクトを作成して新しい URL を設定します。
            UrlSource resultSource = new UrlSource();
            resultSource.setUri(newAuthUrl);
            sourceRefreshCallback.onSuccess(resultSource);
        } else {
            Log.e(TAG, "更新に失敗しました: 新しい認証付き URL の生成に失敗しました。");
            sourceRefreshCallback.onError("REFRESH_ERROR: 新しい 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 アルゴリズムが見つかりません", e);
    }
}

バインドされた NIC の切り替え

ApsaraVideo Player SDK for Android は、AliPlayerGlobalSettings.enableSwitchNIC メソッドを提供しており、ネットワーク異常時にネットワークインターフェースコントローラー (NIC) を自動的に切り替えて、リソース再生の安定性を確保できます。サンプルコード:

説明

これは、スイッチが有効になっており、複数の NIC が存在する場合にのみ有効になります。

AliPlayerGlobalSettings.enableSwitchNIC(true);

パフォーマンス

再生シーンの設定

再生シーンを設定すると、そのシーンに最適なパラメーター (バッファー設定、機能スイッチなど) が自動的に設定されます。setConfig インターフェイスを通じて行ったカスタムパラメーター設定とも互換性があります (カスタム設定が優先されます)。

説明
  • 再生シーンを設定した後、getConfig インターフェイスを通じてパラメーター設定を確認できます。

API 例

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

再生シーン

public enum PlayerScene {
    /**
     * シーンなし
     */
    NONE,
    /**
     * 長尺シーン:30 分以上に適用
     */
    LONG,
    /**
     * 中尺シーン:5 分~30 分に適用
     */
    MEDIUM,
    /**
     * 短尺シーン: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. この機能を有効にすると、準備成功イベントと最初のフレームレンダリングイベントのトリガー順序に影響します。無効時に比べ、有効時にデコーディングおよびレンダリング速度の違いにより、最初のフレームレンダリングイベントが準備成功イベントの前にトリガーされる場合がありますが、再生には影響しません。

例:

aliPlayer.setOption(ALLOW_PRE_RENDER, 1);

ローカルキャッシュ

説明

詳細なコード例については、「API-Example」の 動画プリロード (Preload) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。

ApsaraVideo Player SDK for Android はローカルキャッシュ機能を提供しており、ユーザーが動画の再再生時に起動速度、シーク速度を向上させ、カクつきを減らし、トラフィックを節約できます。

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

ローカルキャッシュ機能はデフォルトで無効になっています。使用するには、手動で有効にする必要があります。AliPlayerGlobalSettingsenableLocalCache を通じて制御します。サンプルコード:

コード表示

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

/**
 *  以下のコードを使用してキャッシュ設定を行うこともできます。
 *  ローカルキャッシュを有効にします。有効にすると、ローカルファイルにキャッシュされます。
 *  @param enable: ローカルキャッシュ機能スイッチ。true: 有効、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。クリーンアップ時に、maxCapacityMB と同様に、現在のディスク領域がこの値未満の場合、ルールに従ってキャッシュファイルが順に削除され、freeStorage がこの値以上になるか、すべてのキャッシュがクリアされるまで続けられます。
 * public static void setCacheFileClearConfig(long expireMin,
 *         long maxCapacityMB,
 *         long freeStorageMB)
 */

 /**
  * 読み込み URL のハッシュ値のコールバックを設定します。設定しない場合、SDK は MD5 アルゴリズムを使用します。
  * public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
  */
説明
  • 動画再生 URL に認証パラメーターが含まれている場合、ローカルキャッシュおよび再生中にこれらのパラメーターが変更されます。同じ URL で異なる認証を使用した場合のキャッシュヒット率を向上させるために、setCacheUrlHashCallback インターフェイスを使用して、ハッシュ値 (例:MD5) を計算する前に認証パラメーターを URL から削除できます。例:認証付きの再生 URL が http://****.mp4?aaa の場合、読み込み時に http://****.mp4 を使用してハッシュ値を計算します。ただし、動画が暗号化された M3U8 動画の場合、キー URL の認証パラメーターを削除してハッシュ値を計算すると、異なる動画が同じキーをキャッシュにヒットさせ、再生に失敗する可能性があります。解決策:setCacheUrlHashCallback コールバック内でドメインチェックを行い、再生ドメイン (http(s)://xxxxx.m3u8?aaaa) のみ認証パラメーターを削除し、キー URL のドメイン (http(s)://yyyyy?bbbb) では削除しないようにします。进阶功能-本地缓存.png

  • サーバーが HTTP および HTTPS の両方をサポートしており、異なるプロトコルが同じメディアファイルを指している場合、ハッシュ値を計算する前にリクエストヘッダーを削除または統一できます。例:

    • 動画再生 URL が https://****.mp4 および http://****.mp4 の場合、読み込み時に ****.mp4 を使用してハッシュ値を計算します。

    • 動画再生 URL が https://****.mp4 の場合、ハッシュ値を計算する前に http://****.mp4 に統一します。

  • プレーヤー SDK バージョン 5.5.4.0 以降で、動画再生 URL に認証パラメーターが含まれており、再生プロトコルが HLS の場合、PlayerConfig.mEnableStrictAuthMode フィールドを設定して、異なる認証モードを選択できます (古いバージョンのデフォルト値は false、V7.13.0 以降は true)。

    • 非厳密認証 (false):認証もキャッシュされます。前回の再生でメディアの一部のみがキャッシュされていた場合、プレーヤーはキャッシュされた認証を使用して、キャッシュされていない部分のリクエストを行います。URL 署名の有効期間が短い場合や、長時間停止後に再生を再開する場合、認証が有効期限切れとなり、再生ソースの自動更新 機能を統合して、有効期限切れの認証を処理し、再生を継続する必要があります。

    • 厳密認証 (true):認証はキャッシュされません。各再生開始時に認証が実行されるため、ネットワーク接続がないと再生に失敗します。

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

単一の URL に対してローカルキャッシュ機能を有効または無効にするには、player config で設定できます。

// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// 再生 URL のローカルキャッシュを有効にするかどうか。デフォルト値は true です。AliPlayerGlobalSettings でローカルキャッシュが有効になっており、ここでローカルキャッシュも有効に設定されている (true に設定されている) 場合、この URL のローカルキャッシュが有効になります。ここで false に設定されている場合、この URL のローカルキャッシュは無効になります。
config.mEnableLocalCache = false;
....// その他の設定

// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);

プリロード

ApsaraVideo Player SDK for Android はプリロード機能を提供しており、これはローカルキャッシュ機能のアップグレード版です。動画キャッシュのメモリサイズを設定することで、動画の起動速度をさらに向上させることができます。

プリロード機能の使用制限は次のとおりです。

  • 現在、MP4、MP3、FLV、HLS などの単一メディアファイルの読み込みをサポートしています。

説明

ApsaraVideo Player SDK for Android は、プリロード中にデフォルトで自動ネットワークリソーススケジューリング機能を提供しており、再生中の動画のネットワークリクエストへのプリロードネットワークリクエストの影響を軽減します。自動スケジューリング戦略は、再生中の動画のバッファーが一定のしきい値に達した場合にのみ、プリロードがリクエストを許可するというものです。リアルタイムのプリロードリクエストを自分で制御するには、以下の方法でこの戦略を無効にできます。

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

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

    VidAuth (推奨)

    VidAuth vidAuth = new VidAuth();
    vidAuth.setVid("Vid info");// 必須パラメーター、動画 ID (VideoId)。
    vidAuth.setPlayAuth("<yourPlayAuth>");// 必須パラメーター、再生認証情報。ApsaraVideo VOD サービスの GetVideoPlayAuth API を呼び出して生成する必要があります。
    vidAuth.setRegion("Access region");// プレーヤー SDK V5.5.5.0 以降では、このパラメーターは非推奨です。リージョンを設定する必要はなく、プレーヤーが自動的に解析します。プレーヤー SDK バージョン 5.5.5.0 以前では、このパラメーターは必須です。ApsaraVideo VOD サービスのアクセスリージョンで、デフォルトは cn-shanghai です。
    vidAuth.setQuality("Selected definition") //"AUTO" はアダプティブビットレートを表します。

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Vid info");// 必須パラメーター、動画 ID (VideoId)。 vidSts.setAccessKeyId("<yourAccessKeyId>");// 必須パラメーター、一時的な STS トークンペアの AccessKey ID。STS サービスの AssumeRole API を呼び出して生成する必要があります。  vidSts.setAccessKeySecret("<yourAccessKeySecret>");// 必須パラメーター、一時的な STS トークンペアの AccessKey Secret。STS サービスの AssumeRole API を呼び出して生成する必要があります。  vidSts.setSecurityToken("<yourSecurityToken>");// 必須パラメーター、STS セキュリティトークン。STS サービスの AssumeRole API を呼び出して生成する必要があります。  vidSts.setRegion("Access region");// 必須パラメーター、ApsaraVideo VOD サービスのアクセスリージョンで、デフォルトは cn-shanghai です。
    vidSts.setQuality("Selected definition") //"AUTO" はアダプティブビットレートを表します。

    UrlSource

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("Playback address");// 必須パラメーター、再生アドレス。サードパーティの VOD アドレスまたは Alibaba Cloud ApsaraVideo VOD サービスの再生アドレスです。
  3. タスクパラメーターを設定します。

    説明

    これはマルチビットレート動画にのみ適用されます。setDefaultBandWidthsetDefaultResolution、または setDefaultQuality のいずれか 1 つを選択できます。

    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);

// ベースラインプリロード期間を設定します。
// プリロード期間を 1000ms に設定します。
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 動画のプリロード

listPlayer + マルチビットレート HLS 動画再生シナリオでは、統合者は現在の再生画質と一致するストリームをプリロードし、ビジネスニーズに基づいてプリロードモードを選択できます。

サポートされているプリロードモードを表示

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

  /**
   * 最初のフレームコスト (FC) 優先。最初のフレームコストを削減します。プリロードされた HLS ストリームのビットレートのみを再生します。
   */
  MultiBitratesMode_FCPrio(1),

  /**
   * 最初のフレームと再生のスムーズ性。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 はマルチビットレート m3u8 にのみ影響します。
        aliListPlayer.selectTrack(-1);
    }
});

ダウンロード速度の取得

現在再生中の動画のダウンロード速度は、onInfo コールバックで getExtraValue API を使用して取得します。サンプルコード:

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 機能を提供し、Alibaba Cloud CDN ネットワーク向けの精密なスケジューリングおよびリアルタイム解決をサポートし、ネットワークパフォーマンスを効果的に向上させます。

強化された HTTPDNS の使用例

強化された HTTPDNS は、Alibaba Cloud CDN ドメイン名に対してのみ HTTPDNS サービスを提供します。設定するドメイン名が Alibaba Cloud CDN ドメイン名であり、ドメイン名設定が完了していて正常に使用できることを確認してください。ApsaraVideo VOD で CDN ドメイン名を追加および設定する方法については、「高速化ドメイン名の追加」をご参照ください。CDN ドメイン名の詳細については、「Alibaba Cloud CDN」をご参照ください。

// 強化された HTTPDNS を有効にします。
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// オプションで、HTTPDNS 事前解決ドメイン名を追加します。
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");

HTTP/2

説明

ApsaraVideo Player SDK for Android は、バージョン 5.5.0.0 以降で HTTP/2 をデフォルトで有効にしています。

ApsaraVideo Player SDK for Android は HTTP/2 プロトコルをサポートしており、多重化を使用して head-of-line ブロッキングを回避し、再生パフォーマンスを向上させます。サンプルコード:

AliPlayerGlobalSettings.setUseHttp2(true);

HTTP 事前接続 TCP

HTTP 動画再生リクエスト (HTTPS ではない) の場合、事前に TCP 接続を確立することで、ユーザーエクスペリエンスを大幅に向上させ、ネットワーク接続時間を短縮し、再生の即時性および継続性を保証し、ネットワークおよびシステムリソースの使用を最適化できます。使用方法は次のとおりです。

// ドメイン形式は host[:port] で、ポートはオプションです。複数のドメイン名はセミコロン (;) で区切ります。
// グローバル設定
// 完全なインターフェイスは、各設定で現在の文字列を使用します (増やす - 追加、減らす - 削除)。空の文字列は事前接続を停止します。
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

動画ダウンロード

説明

詳細なコード例については、「API-Example」の 動画ダウンロードおよびオフライン再生 (Download) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。

ApsaraVideo Player SDK for Android は、ApsaraVideo VOD 動画のダウンロード機能を提供しており、ユーザーが動画をローカルにキャッシュして ApsaraVideo Player で視聴できるようにします。通常ダウンロードとセキュアダウンロードの 2 種類のダウンロード方法があります。

  • 通常ダウンロード

    ダウンロードされた動画データは Alibaba Cloud によって暗号化されず、ユーザーはサードパーティのプレーヤーで再生できます。

  • セキュアダウンロード

    ダウンロードされた動画データは Alibaba Cloud によって暗号化されます。サードパーティのプレーヤーでは再生できません。Alibaba Cloud のプレーヤーでのみ再生できます。

使用上の注意

  • 動画ダウンロード機能は、VidSts および VidAuth 方法でのみサポートされています。

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

  • 動画ダウンロードは、再開可能なダウンロードをサポートしています。

操作手順

  1. オプション: セキュアダウンロードの暗号化検証ファイルを設定します。これはセキュアダウンロードにのみ必要で、通常ダウンロードには不要です。

    説明

    設定された暗号化検証ファイルがアプリ情報と一致していることを確認してください。一致していない場合、動画ダウンロードは失敗します。

    ダウンロード方法をセキュアダウンロードに設定する場合、ApsaraVideo VOD コンソールで生成されたキーファイルをプレーヤー SDK に設定する必要があります。このファイルは、動画ダウンロードおよび再生時の復号および検証に使用されます。キーファイルの生成方法については、「セキュアダウンロードの有効化」をご参照ください。

    Application で一度設定することを推奨します。サンプルコード:

    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("video ID (VideoId)"); // 動画 ID (VideoId)。
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // 一時的なセキュリティトークンサービス (STS) AccessKey ペアの AccessKey ID。STS の AssumeRole 操作を呼び出してこの値を生成する必要があります。
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // 一時的なセキュリティトークンサービス (STS) AccessKey ペアの AccessKey Secret。STS の AssumeRole 操作を呼び出してこの値を生成する必要があります。
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // セキュリティトークンサービス (STS) トークン。STS の AssumeRole 操作を呼び出してこの値を生成する必要があります。
      aliyunVidSts.setRegion("video-on-demand サービスがデプロイされているリージョン"); // video-on-demand サービスがデプロイされているリージョン。デフォルト値: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("Vid info");// 動画 ID。
      vidAuth.setPlayAuth("<yourPlayAuth>");// 再生認証情報。ApsaraVideo VOD サービスの GetVideoPlayAuth API を呼び出して生成する必要があります。
      vidAuth.setRegion("Access region");// プレーヤー SDK V5.5.5.0 以降では、このパラメーターは非推奨です。リージョンを設定する必要はなく、プレーヤーが自動的に解析します。プレーヤー SDK バージョン 5.5.5.0 以前では、このパラメーターは必須です。ApsaraVideo VOD サービスのアクセスリージョンで、デフォルトは cn-shanghai です。
      // VOD コンソールで HLS 標準暗号化パラメーターパススルーを有効にしている場合、デフォルトのパラメーター名が MtsHlsUriToken であるため、config を設定し、それを vid に渡す必要があります。以下を参照してください。
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(config);
      // ダウンロードソースを準備します。
      mAliDownloader.prepare(vidAuth);
    説明
    • ソースファイルのフォーマットと出力ダウンロードファイルのフォーマットは同じでなければならず、変更できません。

    • VOD コンソールで HLS 標準暗号化パラメーターパススルーを有効にしている場合、デフォルトのパラメーター名は MtsHIsUriToken です。詳細については、「HLS 標準暗号化パラメーターパススルー」をご参照ください。その後、上記のコードに従って VOD ソースの MtsHIsUriToken 値を設定します。

  5. 準備が成功したら、ダウンロードアイテムを選択してダウンロードを開始します。

    準備が成功すると、OnPreparedListener メソッドがコールバックされます。返された TrackInfo には、各動画ストリームの定義などの情報が含まれます。ダウンロードするトラックを選択します。サンプルコード:

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

    VidSts および VidAuth の有効期限切れを防ぐために、ダウンロード開始前にダウンロードソース情報を更新することもできます。サンプルコード:

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

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

    mAliDownloader.stop();
    mAliDownloader.release();
  8. オプション: ダウンロードされたファイルを削除します。

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

    // オブジェクトを通じてファイルを削除します。
    mAliDownloader.deleteFile();
    // スタティックメソッドを通じてファイルを削除します。成功した場合、0 を返します。
    AliDownloaderFactory.deleteFile("削除するダウンロードフォルダのパス", "動画 ID", "動画フォーマット", "ダウンロードされた動画のインデックス");

次のステップ

ダウンロードされた動画は、ApsaraVideo Player を使用して再生できます。具体的な方法は次のとおりです。

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

    String path = mAliDownloader.getFilePath();
  2. VOD UrlSource 方法を使用して再生の絶対パスを設定します。

     UrlSource urlSource = new UrlSource();
            urlSource.setUri("Playback address");// ダウンロードされた動画の絶対パスを設定します。
            aliPlayer.setDataSource(urlSource);

暗号化動画再生

ApsaraVideo VOD は、HLS 暗号化、Alibaba Cloud 専用の暗号化、および DRM 暗号化をサポートしています。ライブストリーミングは DRM 暗号化のみをサポートしています。暗号化再生については、「暗号化動画再生」をご参照ください。

Native RTS 再生

ApsaraVideo Player SDK for Android は Native RTS SDK を統合して、ネイティブ低遅延ライブストリーミングを実装します。詳細については、「Android での RTS ストリームフェッチングの実装」をご参照ください。

参照