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

ApsaraVideo VOD:高度な機能

最終更新日:Jun 05, 2026

プレイリスト再生、字幕、動画ダウンロード、暗号化再生といった Android プレーヤー SDK の高度な機能を利用できます。API リファレンス

重要

デモを実行するには、デモをダウンロードし、デモの実行に記載されている手順に従って、コンパイルして実行します。

Professional Edition ライセンスの検証

説明

一部のプレーヤー機能では、Professional Edition ライセンスが必要です。サポートされている機能は、プレーヤー SDK 機能の詳細で確認してください。これらの機能を使用するには、プレーヤー 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 に理由が含まれます。

再生

プレイリストの再生

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 ソースをサポートします。例:

    • URL:サードパーティまたは Alibaba Cloud ApsaraVideo VOD の再生アドレスです。Alibaba Cloud の再生アドレスを取得するには、GetPlayInfo を呼び出します。VOD サーバー SDK を統合してアドレスを取得することで、自己署名を回避できます。開発者ポータル

    • Vid:オーディオまたはビデオの ID です。この ID は、コンソール (パス:メディアライブラリ > オーディオ/ビデオ) から、またはオーディオ/ビデオをアップロードした後にサーバー API (メディア情報の検索) を使用して取得できます。

    // 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 ソースにこのメソッドを使用します。
    aliListPlayer.moveTo(String uid);
    // Vid ソースにこのメソッドを使用します。STS 一時的な認証情報と一時的なアクセスキーペアを含む stsInfo を渡す必要があります。これらの認証情報は事前に取得してください。詳細については、「RAM ロールの作成および STS 一時的な権限付与の実行」をご参照ください。
    aliListPlayer.moveTo(String uid, StsInfo info);
  7. 前または次の動画の再生

    • moveTo を呼び出してビデオソースを再生した後、moveToPrevmoveToNext を呼び出して、moveTo で指定したビデオソースをアンカーとして、前の動画または次の動画を再生します。例:

      説明

      moveTomoveToNext などのメソッドを同じ view を使用して呼び出し、ビデオソースを切り替えると、ちらつきや黒い画面が発生する場合があります。この場合は、listPlayer を初期化する際に、PlayerConfig フィールド mClearFrameWhenStopfalse に設定し、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 チャンネルのレンダリングをサポートします。ライブストリーミングでは、これらのアニメーションはライブコンテンツを遮ることなく再生されます。

制限事項

統合 SDK バージョン 6.8.0 以降、またはプレーヤー SDK バージョン 6.9.0 以降は、透過レンダリングをサポートします。

メリット

透明度を含む MP4 動画は、APNG や IXD と比べて、アニメーション品質が高く、ファイルサイズが小さく、互換性が高く、開発効率が向上します。

  1. アニメーション品質の向上:MP4 は、APNG や IXD よりも元の詳細と色を正確に保持します。

  2. ファイルサイズの縮小:MP4 はより効率的に圧縮されるため、読み込み速度が向上し、帯域幅の消費が削減されます。

  3. 互換性の向上:MP4 は、あらゆるデバイスやブラウザーでサポートされています。

  4. 開発効率の向上:開発者は、複雑な解析とレンダリングのロジックを実装する必要がありません。

サンプルコード

次のインターフェイスで alpha モード (ビデオアセット内の alpha チャンネルの位置:上、下、左、右) を設定します。デフォルト値は None です。

説明
  • アセット内の alpha チャンネルの位置は、setAlphaRenderMode メソッドで設定する値と一致している必要があります。

  • playerview のサイズは、アセットの解像度に比例させる必要があります。

/**
 * alpha レンダリングモードを設定します。
 *
 * @param alphaRenderMode 指定された alpha レンダリングモード。{@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 の使用方法-----------
// 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) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、デベロッパーが SDK 統合のコア機能を短時間で習得するのに役立ちます。

Android プレーヤー SDK は、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) {
                    // 追加された外部字幕トラックを選択して表示します。
                    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 を使用して WebVTT 外部字幕を完全にサポートしており、字幕のフォントサイズ、フォントカラー、特定のフォントを柔軟にカスタマイズできます。

説明

適用シナリオ:

  • WebVTT 字幕のスタイルのカスタマイズ。

  • ApsaraVideo Player SDK バージョン 7.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 を作成する必要があります。

      /**
        * カスタム TypefaceSpan クラス。
        * 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);

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

説明

再生を開始する前にデコード方式を切り替えてください。再生中の切り替えは無効です。

Android プレーヤー SDK は、enableHardwareDecoder スイッチを使用して、H.264 および H.265 のハードウェアデコードをサポートしています。ハードウェアデコードはデフォルトで有効になっており、初期化に失敗した場合は自動的にソフトウェアデコードにフォールバックします。例:

// ハードウェアデコードを有効にします。デフォルトでは有効です。
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.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 のビデオパッケージングおよびトランスコードテンプレートグループを使用して生成できます。詳細な操作については、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);

Android プレーヤー SDK は、アダプティブビットレートの 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);

スクリーンショット

Android プレーヤー SDK は、snapshot インターフェイスにより、再生中のビデオのスクリーンショット機能を提供します。このインターフェイスは元のデータをキャプチャし、bitmap として返します。コールバックインターフェイスは OnSnapShotListener です。例:

// スクリーンショットのコールバックを設定します。
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int width, int height){
        // ビットマップと画像のサイズを取得します。
    }
});
// 現在再生中のフレームをキャプチャします。
aliPlayer.snapshot();

プレビュー再生

ApsaraVideo VOD を構成すると、Android プレーヤー SDK でプレビュー再生を実装できます。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 はサーバーのリクエストパラメーターに対応しています。詳細については、「リクエストパラメーターの説明」をご参照ください。

  • FLV 形式の動画、および MP3 形式の音声では、プレビュー再生はできません。

ブラックリストの設定

Android プレーヤー SDK は、ハードウェアデコードのブラックリストメカニズムを提供します。ハードウェアデコードを明示的に使用できないデバイスでは、ソフトウェアデコードを直接使用して、無効な操作を回避します。例:

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

ブラックリストは、アプリの終了後に自動的に無効になります。

Referer の設定

PlayerConfigmReferrer プロパティを使用してリクエストの Referer を設定します。コンソールの Referer ブロックリスト/許可リストと組み合わせることで、アクセス権限を制御します。例:

// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// mReferrer プロパティを設定します。例:http://example.aliyundoc.com。(注:プロトコルを含めてください。)
config.mReferrer = referrer;
....// その他の設定。
  // プレーヤーに設定を適用します。
aliPlayer.setConfig(config);

ユーザーエージェントの設定

PlayerConfig でリクエストのユーザーエージェントを設定します。これにより、プレーヤーからのリクエストに UA が付加されます。例:

// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// UA を設定します。
config.mUserAgent = "UserAgent to set";
....// その他の設定。
  // プレーヤーに設定を適用します。
aliPlayer.setConfig(config);

ネットワークの再試行時間と回数の設定

PlayerConfig を使用して、ネットワークタイムアウトとリトライ回数を設定します。例:

// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ネットワークのタイムアウト時間をミリ秒単位で設定します。
config.mNetworkTimeout = 5000;
// タイムアウトのリトライ回数を設定します。リトライの間隔は mNetworkTimeout です。mNetworkRetryCount = 0 はリトライしないことを意味し、リトライポリシーはアプリが決定します。デフォルト値は 2 です。
config.mNetworkRetryCount=2;
....// その他の設定
  // プレーヤーに設定を適用します。
aliPlayer.setConfig(config);
説明
  • NetworkRetryCount が設定されており、ネットワークの問題により読み込み状態になった場合、プレーヤーは mNetworkTimeout の間隔で NetworkRetryCount 回リトライします。

  • 複数回のリトライ後も読み込み状態が続く場合、onError イベントがトリガーされ、ErrorInfo.getCode() は ErrorCode.ERROR_LOADING_TIMEOUT となります。

  • NetworkRetryCount が 0 に設定されている場合、ネットワーク接続がタイムアウトすると、プレーヤーは、InfoBean.getCode() の値が InfoCode.NetworkRetry となる onInfo イベントをトリガーします。この時点で、プレーヤーの reload メソッドを呼び出してネットワークを再読み込みするか、他の方法で処理できます。

キャッシュとレイテンシー制御の設定

Android プレーヤー SDK は、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);
重要
  • バッファー時間は次の条件を満たす必要があります: 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);

ピクチャー イン ピクチャー

説明

詳細なコード例については、API-Exampleピクチャー イン ピクチャー再生 (PictureInPicture) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、デベロッパーが SDK 統合のコア機能を短時間で習得できるようにします。

手順:

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

    <activity
      android:name=".PictureInPictureActivity"
      android:exported="true"
      android:supportsPictureInPicture="true"
      android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />
  2. 対象の アクティビティ をピクチャー イン ピクチャー モードに切り替えます。

    Rational aspectRatio = new Rational(16, 9); // ピクチャー イン ピクチャーのアスペクト比。ビジネス要件に基づいて調整してください。
    PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
    pipBuilder.setAspectRatio(aspectRatio);
    enterPictureInPictureMode(pipBuilder.build());

    ピクチャー イン ピクチャー モードは、OnClick (クリックイベント)、アプリを離れるとき、または戻るボタンを押したときにトリガーできます。実装方法:

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

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

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

    @Override
    protected void onUserLeaveHint() {
        super.onUserLeaveHint();
        Rational aspectRatio = new Rational(16, 9); // ピクチャー イン ピクチャーのアスペクト比。
        PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
        pipBuilder.setAspectRatio(aspectRatio);
        enterPictureInPictureMode(pipBuilder.build());
    
        Log.e(TAG, "Picture-in-Picture onUserLeaveHint");
    }

    戻るボタン押下時のトリガー

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // 戻るボタンの押下でトリガーします。
        enterPictureInPictureMode();
    }
  3. ピクチャー イン ピクチャーの表示/非表示に応じて UI を処理します。

    @Override
    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
        if (isInPictureInPictureMode) {
            // ピクチャー イン ピクチャー モードへの移行を処理します。
            // UI を非表示にします。
            Log.e(TAG, "Entered Picture-in-Picture mode");
        } else {
            // ピクチャー イン ピクチャー モードの終了を処理します。
            // UI を表示します。 
            Log.e(TAG, "Exited Picture-in-Picture mode");
        }
    }

RTS 超低遅延ライブ再生

説明

詳細なコード例については、API-ExampleRTS 超低遅延ライブ再生 (RtsLiveStream) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトにより、デベロッパーはコア SDK の統合機能を迅速に習得できます。

RTS ライブ再生

左右音声チャンネルの入れ替え

Android プレーヤー SDK は、出力オーディオチャンネルを設定するための setOutputAudioChannel メソッドを提供します。入力ソースがステレオの場合、このメソッドを使用して左または右チャンネルに切り替えることができます。入力ソースがモノラルの場合、設定しても効果はありません。

説明

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

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

オーディオストリームの解析

リスナーを設定して、オーディオストリームとビデオストリームのデータを取得します。暗号化されたストリームは解析できないため、ストリームは暗号化されていない必要があります。

コードを展開して表示

// 任意の設定 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;
});

ビデオ背景色の設定

Android プレーヤー SDK では、プレーヤーのレンダリング背景色を設定できます。インターフェイスと使用方法は次のとおりです。

インターフェイス例

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

使用方法

// パラメーターは 8 桁の 16 進数値です。各 2 桁は、順番に A (アルファ透明度)、R (赤)、G (緑)、B (青) を表します。
// 例えば、0xff00ff00 は緑色を表します。
aliPlayer.setVideoBackgroundColor(0xff00ff00);

vidAuth:指定再生ドメインの設定

vidAuth を使用すると、vid のドメインなどのフィールドを指定できます。サポートされているフィールドについては、「GetPlayInfo リクエストパラメーター」をご参照ください。インターフェイスと使用方法:

インターフェイスの例

/**
 * 再生パラメーターを設定します。
 *
 * @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) は、同等の画質でビットレートを大幅に削減する次世代ビデオコーディング規格です。H.266 デコーディング機能は、オンデマンドで統合できるよう、プラグインとして独立してパッケージ化されています。

前提条件

  1. プレーヤー SDK/統合 SDK のバージョンが V7.6.0 以降であること。

  2. Professional Edition のライセンス認証が完了していること。プレーヤー SDK ライセンスの取得

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

プラグインの統合

プレーヤー SDK

Maven 統合 (推奨)

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

説明

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

// x.x.x はプレーヤー SDK のバージョン番号と一致します。
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x

ローカル統合

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

統合 SDK

Maven 統合

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

// x.x.x は統合 SDK のバージョン番号と一致します。
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x-aio

プラグインの有効化

説明

Android プレーヤー SDK 7.7.0 以降、プラグインは統合後にデフォルトで有効になり、手動での有効化は不要です。

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

関連エラーコード

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

再生ソースの自動更新

再生ソースの自動更新を有効にすると、認証メカニズムによるソースの有効期限切れが原因で発生する再生の中断を防ぐことができます。

前提条件

  1. プレーヤー/統合 SDK バージョン V7.9.0 以降。

  2. 再生向け VidAuth ソース を使用していること、またはサービス側で URL 署名 を構成していること。

VidAuth ソース

インターフェイスの例

/**
 * 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 ソースを更新し、
     * {@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 ポータル」をご参照ください。

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

        // ------------------- ユーザーによる実装はここから -------------------
        // アプリケーションサーバーから新しい PlayAuth を取得するために、独自の関数を呼び出します。
        // clientGetPlayAuthFunction は関数名の例です。独自の実装に置き換えてください。
        clientGetPlayAuthFunction(vid, new PlayAuthCallback() {
            
            /**
             * 新しい認証情報の取得に成功したときのコールバック。
             * @param newPlayAuth サーバーから取得した新しい再生認証情報の文字列。
             */
            @Override
            public void onAuthSuccess(String newPlayAuth) {                
                // 1. 新しい PlayAuth を使用して古い vidAuth オブジェクトを更新します。
                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>
 */
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] 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 を例とします)。
        // 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, "Refresh success, new URL: " + newAuthUrl);
            // SDK が要求する UrlSource オブジェクトを作成し、新しい 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 の切り替え

Android プレーヤー SDK は、ネットワークの異常時に NIC を自動的に切り替え、リソースの安定した再生を確保する AliPlayerGlobalSettings.enableSwitchNIC メソッドを提供します。例:

説明

これは、切り替え機能が有効で、かつ複数の NIC が存在する場合にのみ有効になります。

AliPlayerGlobalSettings.enableSwitchNIC(true);

オーディオエンハンスメント

Android プレーヤー SDK は、音声再生体験を向上させるためのオーディオエンハンスメントプラグインを提供しており、音量正規化、音声強調、サラウンドサウンドが特徴です。

機能紹介

  • 音量正規化:すべてのオーディオコンテンツを一定の音量レベルに自動調整し、元の音量が極端に低いまたは高い動画の再生体験を大幅に向上させます。

    • 対応チャンネル:モノラル / ステレオ / 5.1 / 7.1。

    • 対応サンプルレート:16 kHz / 44.1 kHz / 48 kHz。

  • 音声強調:元の音色を維持しながら対話をインテリジェントに強調し、騒がしいシーンでも音声をよりクリアで明るくします。

    • 対応チャンネル:ステレオ。

    • 対応サンプルレート:44.1 kHz / 48 kHz。

  • サラウンドサウンド:マルチチャンネルおよびステレオ動画に仮想サラウンドレンダリングを適用し、ヘッドフォンや標準的なデバイスで没入感のある体験を提供します。3DSurround (ステレオサラウンド) と MegaBass (スーパーベース) モードを備えています。

    • 対応チャンネル:モノラル / ステレオ / 5.1 / 7.1。

    • 対応サンプルレート:44.1 kHz / 48 kHz。

前提条件

  1. プレーヤー/統合 SDK のバージョンが V7.13.0 以降であること。

  2. Professional Edition License の権限が付与されていること。プレーヤー SDK ライセンスの取得

重要

オーディオエンハンスメントが対応するオーディオソース:

プラグインの統合

Maven 統合 (推奨)

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

説明

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

// x.x.x はプレーヤー SDK のバージョン番号と一致します。
implementation 'com.aliyun.sdk.android:AlivcAudioEnhanceFilter:x.x.x'

ローカル統合

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

機能インターフェイス

setFilterValid

オーディオエンハンスメントのマスタースイッチを制御します。オーディオエンハンスメントフィルターの target 名は audioEnhance です。無効にすると、3 つのサブ機能はすべて無効になります (デフォルトでは無効)。

player.setFilterValid("audioEnhance", true);   // 有効化。
player.setFilterValid("audioEnhance", false);  // 無効化。
setFilterConfig

FilterConfigprepare の前に設定します。再生開始後に有効になります。

FilterConfig filterConfig = new FilterConfig();
FilterConfig.Filter filterItem = new FilterConfig.Filter("audioEnhance");
FilterConfig.FilterOptions opts = new FilterConfig.FilterOptions();
// サラウンドサウンド。
opts.setOption("enable_surround", true);
opts.setOption("surround_effect_type", "3DSurround"); // 初回使用時は、タイプを enable_surround と一緒に設定する必要があります。
// 音声強調。
opts.setOption("enable_dialoguenhance", true);
opts.setOption("dialoguenhance_voice", 1.0f); // 1.0 ~ 10.0。初回使用時は、音声強調の強度を enable_dialoguenhance と一緒に設定する必要があります。
// 音量正規化。
opts.setOption("enable_normalizer", true);

filterItem.setOptions(opts);
filterConfig.addFilter(filterItem);
player.setFilterConfig(filterConfig);

パラメーター

タイプ

説明

enable_surround

Boolean

サラウンドサウンド機能スイッチ。

surround_effect_type

String

サラウンドサウンドタイプ: "3DSurround" / "MegaBass"

enable_dialoguenhance

Boolean

音声強調機能スイッチ。

dialoguenhance_voice

Float

音声強調の強度、範囲 1.0 ~ 10.0

enable_normalizer

Boolean

音量正規化機能スイッチ。

updateFilterConfig

プレーヤーの準備中または準備後に、パラメーターを動的に調整するには、このインターフェイスを呼び出します。

説明

updateFilterConfigprepare の前に呼び出しても効果はありません。初期設定には setFilterConfig を使用してください。

FilterConfig.FilterOptions opts = new FilterConfig.FilterOptions();
opts.setOption("enable_surround", true);
opts.setOption("surround_effect_type", "3DSurround"); // 初回有効時でない場合、初期化が完了しているためこのタイプ設定は無効です。
player.updateFilterConfig("audioEnhance", opts);
重要

サラウンドサウンドタイプ ("3DSurround" / "MegaBass") と音声強調の強度 (dialoguenhance_voice) は、初回使用時に enable 属性と一緒に設定する必要があります。そうしない場合、初期化にはデフォルト値が使用され (サラウンドサウンドのデフォルトは "3DSurround"、音声強調の強度のデフォルトは 1.0)、再生中には変更できません。

パフォーマンス

再生シナリオの設定

再生シナリオを設定すると、最適なパラメーター (バッファー設定や機能スイッチを含む) が自動的に設定されます。setConfig インターフェイスによるカスタムパラメーター設定と互換性があります (カスタム設定が優先されます)。

説明
  • 再生シナリオを設定した後、getConfig インターフェイスを使用してパラメーター設定を表示できます。

インターフェイスの例

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

再生シナリオ

public enum PlayerScene {
    /**
     * シナリオ:なし。
     */
    NONE,
    /**
     * 長編動画シナリオ:30 分を超える動画に適用されます。
     */
    LONG,
    /**
     * 中編動画シナリオ:5 分~30 分の動画に適用されます。
     */
    MEDIUM,
    /**
     * 短編動画シナリオ:5 分以内の動画に適用されます。
     */
    SHORT,
    /**
     * ライブシナリオ。
     */
    LIVE,
    /**
     * 超低遅延ライブシナリオ。
     */
    RTS_LIVE
}

使用方法

// 短編動画シナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.SHORT)

// 中編動画シナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)

// 長編動画シナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.LONG)

// ライブシナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.LIVE)

プリレンダリング

Android プレーヤー SDK は、再生開始前に最初のフレームを高速でレンダリングする機能をサポートしており、起動速度を向上させることができます。

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

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

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

    例:

aliPlayer.setOption(ALLOW_PRE_RENDER, 1);

ローカルキャッシュ

説明

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

ローカルキャッシュは、起動速度、シーク速度を向上させ、繰り返し再生時のカクつきを減らしながら、帯域幅を節約します。

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

ローカルキャッシュはデフォルトで無効になっています。使用するには、AliPlayerGlobalSettingsenableLocalCache を使用して手動で有効にする必要があります。例:

コードを展開して表示

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

/**
 * キャッシュ設定には、次のコードを使用することもできます。
 * ローカルキャッシュを有効にします。有効にすると、コンテンツはローカルファイルにキャッシュされます。
 * @param enable:ローカルキャッシュ機能のスイッチ。true:有効、false:無効。デフォルトでは無効です。
 * @param maxBufferMemoryKB:バージョン 5.4.7.1 以降は非推奨であり、現在効果はありません。
 * @param localCacheDir:設定必須。ローカルキャッシュディレクトリの絶対パス。
 * AliPlayerGlobalSettings.enableLocalCache(enable, maxBufferMemoryKB, localCacheDir);
 */

/**
 * ローカルキャッシュファイルのクリーンアップ設定。
 * @param expireMin - バージョン 5.4.7.1 以降は非推奨であり、現在効果はありません。
 * @param maxCapacityMB - 最大キャッシュ容量 (MB 単位)。デフォルトは 20 GB です。クリーンアップ中、合計キャッシュサイズがこの値を超えた場合、サイズが maxCapacityMB 以下になるまで、キャッシュ項目が古いものから順に削除されます。
 * @param freeStorageMB - 最小空きディスク容量 (MB 単位)。デフォルトは 0 です。クリーンアップ中、現在のディスク空き容量がこの値未満の場合、空き容量がこの値以上になるか、すべてのキャッシュがクリアされるまで、キャッシュ項目が古いものから順に削除されます。
 * public static void setCacheFileClearConfig(long expireMin,
 *         long maxCapacityMB,
 *         long freeStorageMB)
 */

 /**
  * URL ハッシュ値を読み込むためのコールバックを設定します。設定されていない場合、SDK は MD5 アルゴリズムを使用します。
  * public static void setCacheUrlHashCallback(AliPlayerGlobalSettings.OnGetUrlHashCallback cb)
  */
説明
  • 動画の再生 URL に認証パラメーターが含まれている場合、キャッシングと再生でパラメーターが変更されることがあります。認証情報が異なる場合でも同じ URL のキャッシュヒット率を向上させるには、setCacheUrlHashCallback を使用して、ハッシュ値 (例:MD5) を計算する前に認証パラメーターを削除してください。例えば、http://****.mp4?aaa のような URL の場合、http://****.mp4 を使用してハッシュを計算します。ただし、暗号化された m3u8 動画の場合、ハッシュ化する前に keyURL から認証パラメーターを削除すると、異なる動画が同じキーにヒットしてしまい、再生に失敗する可能性があります。解決策として、setCacheUrlHashCallback コールバックでドメインをチェックし、再生ドメイン (http(s)://xxxxx.m3u8?aaaa) の認証パラメーターのみを削除し、keyURL ドメイン (http(s)://yyyyy?bbbb) は削除しないでください。curl を使用して HLS 暗号化動画の M3U8 プレイリストを取得します。ここで、playURL は M3U8 アドレス、keyURL は AES-128 復号キーのアドレスです。ターミナル出力の例:

    # playURL: M3U8 プレイリストリクエスト
    C:\Users\futan>curl "https://videxxxv.cc/a003xxx2a-hd-encrypt-stream.m3u8?MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a&auth_key=17xxxrmonwFHJ"
    
    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-ALLOW-CACHE:YES
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    # keyURL: AES-128 暗号化キーアドレス
    #EXT-X-KEY:METHOD=AES-128,URI="https://apxxx.cc/decrypt?Ciphertext=NWNiNDQyN2MtNjV1ZS00ZWIwLTk0YTAtNTJhOWIyZWV1OTY2MzdoRTJ6TjVxcXkweFY2xxxNCt4OGNFRGNReHRG&MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a"
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00001.ts?auth_key=1706560316-65b7xxx39f1d6c77
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00002.ts?auth_key=1706560316-65b7xxxe8eca2faf
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00003.ts?auth_key=1706560316-65b7xxx50c6981b3
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00004.ts?auth_key=1706560316-65b7xxxf7228c594
    #EXTINF:10.000000,
    e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00005.ts?auth_key=1706560316-65b7xxx6dc68c35d
  • サーバーが同じメディアファイルを指す HTTP と HTTPS の両方のプロトコルをサポートしている場合、ハッシュを計算する前にプロトコルを削除または標準化してください。例:

    • URL https://****.mp4http://****.mp4 の場合、****.mp4 を使用してハッシュを計算します。

    • URL https://****.mp4 の場合、ハッシュを計算する前に http://****.mp4 に標準化します。

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

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

    • 厳密認証 (true):認証はキャッシュされません。認証は起動ごとに発生し、ネットワークがないと起動に失敗します。

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

特定の URL のローカルキャッシュを有効または無効にするには、PlayerConfig で設定します。

// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// 再生URLのローカルキャッシュを有効にするかどうか。デフォルトは true です。グローバルなローカルキャッシュが有効な状態でこの値を true に設定すると、このURLに対してローカルキャッシュが有効になります。false に設定すると、このURLのローカルキャッシュは無効になります。
config.mEnableLocalCache = false;
....// その他の設定。

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

プリロード

プリロードは、動画キャッシングのメモリ使用量を設定することで動画の起動速度を向上させる、ローカルキャッシュのアップグレード版です。

プリロードの制限:

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

説明

Android プレーヤー SDK は、プリロード中のネットワークリクエストが進行中の動画再生に与える影響を軽減するため、デフォルトでネットワークリソースの自動スケジューリングを提供します。この自動スケジューリング戦略では、現在再生中の動画のバッファーが特定のしきい値に達した後にのみプリロードリクエストが許可されます。リアルタイムのプリロードリクエストを自分で制御するには、次のメソッドを使用してこの戦略を無効にしてください。

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

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

    VidAuth (推奨)

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

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Vid info"); // 必須パラメーター: 動画ID。
    vidSts.setAccessKeyId("<yourAccessKeyId>"); // 必須パラメーター: STS 一時 AK ペアのアクセスキー ID。STS の AssumeRole API を呼び出して生成されます。
    vidSts.setAccessKeySecret("<yourAccessKeySecret>"); // 必須パラメーター: STS 一時 AK ペアのアクセスキー。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 のいずれかを選択してください。

    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. (オプション):プリロードされたファイルを削除します。

    容量を節約するために、必要に応じてプリロードされたファイルを削除します。Android プレーヤー SDK は削除インターフェイスを提供していないため、アプリ内のプリロードディレクトリからファイルを削除してください。

動的プリロード

動的プリロード戦略により、開発者は現在再生中の動画のキャッシュと、プリロードされたアイテムの数およびキャッシュの両方を制御でき、再生体験とコストオーバーヘッドのバランスを取ることができます。

コードを展開して表示

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

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

  /**
   * 初回フレーム優先設定。初回フレームのコストを削減します。プリロードされた 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 インターフェイスを使用して実装します。例:

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

ネットワーク機能

HTTPDNS

HTTPDNS は、HTTP 経由でドメイン名を特定のサーバーに名前解決し、DNS ハイジャックのリスクを低減するとともに、より高速で安定した名前解決を提供します。

ApsaraVideo Player SDK は、Alibaba Cloud CDN ドメイン向けに強化された HTTPDNS を提供し、正確な CDN スケジューリングとリアルタイムの名前解決をサポートします。

強化 HTTPDNS の使用例

Enhanced HTTPDNS は Alibaba Cloud CDN ドメイン専用のサービスです。お使いのドメインが Alibaba Cloud CDN ドメインであり、かつ適切に設定されていることを確認してください。VOD で CDN ドメインを追加する場合、「アクセラレーションドメインの追加」をご参照ください。Alibaba Cloud CDN

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

HTTP/2

説明

Android プレーヤー SDK は、バージョン 5.5.0.0 以降、デフォルトで HTTP/2 が有効になります。

Android プレーヤー SDK は HTTP/2 プロトコルをサポートします。HTTP/2 は多重化によりヘッドオブラインブロッキングを回避し、再生パフォーマンスを向上させます。例:

AliPlayerGlobalSettings.setUseHttp2(true);

HTTP TCP 事前接続

HTTP ビデオ再生リクエスト (非 HTTPS) の場合、事前に TCP 接続を確立すると、ユーザーエクスペリエンスが大幅に向上し、ネットワーク接続時間が短縮され、即時かつ連続再生が確保され、ネットワークおよびシステムリソースの使用が最適化されます。使用法:

// ドメイン形式は host[:port] です。port は任意です。複数のドメインはセミコロン (;) で区切ります。
// グローバル設定。
// この設定は、呼び出すたびに指定された文字列で完全に更新されます。その結果、以前のリストと比較してドメインが追加または削除されます。空の文字列を指定すると事前接続は停止します。
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

動画ダウンロード

説明

詳細なコード例については、API-Example動画ダウンロードとオフライン再生 (Download) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、デベロッパーが SDK 統合のコア機能を短時間で習得するのに役立ちます。

Android プレーヤー SDK は、Video on Demand (VOD) サービス向けの動画ダウンロード機能を提供し、ユーザーは ApsaraVideo Player を使用して動画をローカルにキャッシュできます。ダウンロード方式は、標準ダウンロードとセキュアダウンロードの 2 つです。

  • 標準ダウンロード

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

  • セキュアダウンロード

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

使用方法

  • 動画ダウンロードをサポートするのは VidSts と VidAuth のみです。

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

  • 動画ダウンロードはレジュームダウンロードに対応しています。

手順

  1. 任意: セキュアダウンロード用の暗号化検証ファイルを設定します。この設定は、セキュアダウンロードの場合にのみ必要で、標準ダウンロードでは不要です。

    説明

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

    セキュアダウンロードの場合、動画のダウンロードと再生時に復号検証を行うために、VOD コンソールで生成されたキーファイルをプレーヤー SDK に設定します。キーファイルの生成については、「セキュアダウンロードの有効化」をご参照ください。

    Application で 1 回だけ設定することを推奨します。例:

    PrivateService.initService(getApplicationContext(), "Path to encryptedApp.dat file"); // encryptedApp.dat 検証ファイルをスマートフォンに保存し、ここにローカルファイルパスを設定することを推奨します。
  2. ダウンローダーを作成して設定する。

    AliDownloaderFactory を使用してダウンローダーを作成します。例:

    AliMediaDownloader mAliDownloader = null;
    ......
    // ダウンローダーを作成します。
    mAliDownloader = AliDownloaderFactory.create(getApplicationContext());
    // ダウンロードの保存パスを設定します。
    mAliDownloader.setSaveDir("Save folder path");
  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 information"); // 動画 ID (VideoId)。
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // Security Token Service (STS) の AssumeRole API を呼び出して生成された、一時的な STS AccessKey ペアの AccessKey ID。
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // Security Token Service (STS) の AssumeRole API を呼び出して生成された、一時的な STS AccessKey ペアの AccessKey secret。
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // Security Token Service (STS) の AssumeRole API を呼び出して生成された、Security Token Service (STS) トークン。
      aliyunVidSts.setRegion("region"); // Video on Demand (VOD) サービスのリージョン。デフォルト値:cn-shanghai。
      // VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にしていて、デフォルトのパラメーター名が MtsHlsUriToken の場合は、次のように config を設定して 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>");// VOD の GetVideoPlayAuth API を呼び出して生成された再生認証情報。
      vidAuth.setRegion("Access region");// プレーヤー SDK バージョン 5.5.5.0 以降では、このパラメーターは非推奨であり、指定は不要です。プレーヤーがリージョンを自動的に解析します。5.5.5.0 より前のバージョンでは、このパラメーターは必須です。VOD のアクセスリージョンのデフォルトは cn-shanghai です。
      // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしていて、デフォルトのパラメーター名が MtsHlsUriToken の場合は、次のように config を設定して vid に渡します。
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(vidConfig);
      // ダウンロードソースを準備します。
      mAliDownloader.prepare(vidAuth);
    説明
    • ソースファイルのフォーマットはダウンロードしたファイルのフォーマットと一致します。変更はできません。

    • VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしていて、デフォルトのパラメーター名が MtsHlsUriToken の場合は、「HLS 標準暗号化パラメーターのパススルー」をご参照のうえ、上記のとおり VOD ソースに MtsHlsUriToken の値を設定してください。

  5. 準備が完了したら、ダウンロード項目を選択してダウンロードを開始します。

    準備が正常に完了すると、OnPreparedListener メソッドが呼び出されます。返された TrackInfo には、ビデオストリームの解像度などの情報が含まれています。ダウンロード用に Track を 1 つ選択します。例:

    public void onPrepared(MediaInfo mediaInfo) {
        // ダウンロード項目の準備に成功しました。
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        // 例:最初の TrackInfo をダウンロードします。
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
        // ダウンロードを開始します。
        mAliDownloader.start();
    }
  6. (任意) ダウンロードソースの更新

    VidSts と VidAuth の有効期限切れを防ぐために、ダウンロードソース情報を更新してダウンロードを開始できます。例:

    // ダウンロードソースを更新します。
    mAliDownloader.updateSource(aliyunVidSts);
    // ダウンロードを開始します。
    mAliDownloader.start();
  7. ダウンロードの成否にかかわらず、ダウンローダーを解放します。

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

    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 暗号化のみをサポートしています。暗号化再生については、「暗号化再生」をご参照ください。

ネイティブ RTS 再生

Android プレーヤー SDK は、超低レイテンシーライブストリーミングを実現するため、ネイティブ RTS SDK を統合しています。詳細については、「Android で RTS ストリームをプルする実装」をご参照ください。

参考資料