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

ApsaraVideo VOD:高度な機能

最終更新日:Jan 28, 2026

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

重要

デモを実行するには、デモをダウンロードし、「デモの実行」の指示に従ってコンパイルして実行してください。

専門能力検証

説明

ApsaraVideo Player の一部の機能には、Professional Edition のライセンスが必要です。これらの機能を使用するには、ライセンスを取得する必要があります。詳細については、「ApsaraVideo Player SDK の機能」および「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 は Professional Edition 機能の列挙です。関連機能を使用すると、プレーヤーはライセンスを検証し、このコールバックを介して結果を返します。isValid が false の場合、errorMsg には失敗の理由が含まれます。

再生

リスト再生

ApsaraVideo Player SDK for Android は、短編動画フィードに最適な包括的なリスト再生機能を提供します。プリロードなどの機能と組み合わせることで、短編動画の起動速度が大幅に向上します。

操作手順

  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) {
            // ループ再生開始、バッファ位置、現在の再生位置、自動再生開始など、その他の情報イベント
        }
    });
    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 は、サードパーティの VOD URL または ApsaraVideo VOD の再生 URL です。`GetPlayInfo` 操作を呼び出して、ApsaraVideo VOD 内のビデオの再生 URL を取得できます。ApsaraVideo VOD サーバーサイド SDK を統合して、ビデオ再生 URL を取得することを推奨します。この方法では、URL に署名する必要がありません。API を呼び出してビデオ再生 URL を取得する方法の詳細については、「デベロッパーポータル」をご参照ください。

    • Vid:オーディオまたはビデオの ID です。オーディオまたはビデオがアップロードされた後、ApsaraVideo VOD コンソールで [メディア] > [オーディオ/ビデオ] を選択するか、「メディア情報の検索」などのサーバーサイド API 操作を呼び出すことで ID を取得できます。

    // 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 にはこのインターフェイスを使用します
    aliPlayer.moveTo(String uid);
    // VID にはこのインターフェイスを使用します。stsInfo (STS 一時的な認証情報と一時的な AccessKey ペア) を渡す必要があります。事前に取得してください。詳細については、「RAM ロールの作成と一時的な STS 権限の付与」をご参照ください。
    aliPlayer.moveTo(String uid, StsInfo info);
  7. 前または次のビデオの再生

    • moveTo を呼び出してビデオソースを再生した後、moveToPrevmoveToNext を呼び出して、moveTo 呼び出しのビデオソースをアンカーポイントとして使用して、前後のビデオを再生できます。コード例を次に示します。

      説明

      同じ view を使用している場合、moveTo または moveToNext を呼び出してビデオソースを切り替えると、画面のちらつきやブラックアウトが発生する可能性があります。この場合、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 は、アルファチャンネルのレンダリングをサポートし、透明なギフトアニメーションの動的な効果を実現します。ライブチャンネルなどのシナリオで、ライブコンテンツを隠すことなく透明なギフトアニメーションを再生することで、ユーザーの視聴体験とインタラクティブ体験が大幅に向上します。

制限事項

透明レンダリング機能は、All-in-One 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);
//--------------ビューの使用法-------------
// ビューを透明に設定
//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_requirements_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-ExampleExternalSubtitle モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for Android のコア機能を迅速に統合するための Java ベースのサンプルプロジェクトです。

ApsaraVideo Player SDK for 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);

    Player SDK 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) {
                }
            }
        );

音声のみの再生

音声のみの再生を実現するには、prepare を呼び出す前に PlayerConfig を設定してビデオ再生を無効にします。

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

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

説明

再生が開始される前にデコード方法を切り替えてください。再生中の切り替えは効果がありません。

ApsaraVideo Player SDK for Android は、H.264 および H.265 のハードウェアデコード機能と enableHardwareDecoder スイッチを提供します。このスイッチはデフォルトで有効になっています。ハードウェアデコードの初期化に失敗した場合、プレーヤーは自動的にソフトウェアデコードに切り替わり、動画が正常に再生されるようにします。以下にコード例を示します。

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

プレーヤーがハードウェアデコードからソフトウェアデコードに自動的に切り替わった場合、onInfo を介してコールバックがトリガーされます。 以下にコードの例を示します。

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

H.265 アダプティブ再生

現在のデバイスモデルがクラウドベースの H.265 ブラックリストに含まれている場合、または H.265 ストリームのハードウェアデコードに失敗した場合、適応的なフォールバックが発生します。フォールバックプロセスは次のとおりです:H.264 バックアップストリームが設定されている場合、バックアップストリームが自動的に再生されます。H.264 バックアップストリームが設定されていない場合、プレーヤーは自動的に H.265 ソフトウェアデコードにフォールバックします。

説明
  • この機能は、クラウドとクライアントを組み合わせた適応型デコードの付加価値サービスを有効にした後にのみ有効になります。このサービスを有効にするには、Yida フォームを送信してライセンスを申請する必要があります。

  • クラウドとクライアントを組み合わせた適応型デコードの付加価値サービスには、主に次のものが含まれます: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 版 ApsaraVideo Player 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 メソッドを呼び出して再生ストリームをアダプティブビットレートストリーミングに切り替える前に、設定でアダプティブビットレート (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 操作を使用できます。これは生データをキャプチャし、OnSnapShotListener コールバックインターフェイスを介して bitmap として返します。コード例を次に示します。

// スナップショットコールバックを設定
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
    @Override
    public void onSnapShot(Bitmap bm, int with, int height){
        // 取得したビットマップと画像のディメンション
    }
});
// 現在の再生フレームをキャプチャ
aliPlayer.snapshot();

プレビュー

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

プレビュー機能を設定した後、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 設定と組み合わせることで、アクセス権限をコントロールできます。リクエスト Referer を設定するには、PlayerConfig メソッドを使用します。プレーヤー SDK の設定例を次に示します。

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

User-Agent の設定

Android 版 ApsaraVideo Player SDK では、PlayerConfig を使用してリクエストの User-Agent (UA) を設定できます。設定後、プレーヤーはリクエストに UA 情報を含めます。以下のコードは一例です。

// まず、設定を取得します
PlayerConfig config = aliPlayer.getConfig();
// UA を設定します
config.mUserAgent = "設定する User-Agent";
....// その他の設定
  // プレーヤーに設定を適用します
aliPlayer.setConfig(config);

ネットワークリトライ時間と回数の設定

PlayerConfig クラスを使用すると、ApsaraVideo Player SDK for Android のネットワークタイムアウトとリトライ回数を設定できます。次のコードに例を示します。

// まず、設定を取得します
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-ExamplePictureInPicture モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for Android のコア機能を迅速に統合するための Java ベースのサンプルプロジェクトです。

手順は次のとおりです。

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

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

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

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

    OnClick によるトリガー

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

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

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

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

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // バックプレスからトリガー
        enterPictureInPictureMode();
    }
  3. PiP ウィンドウの表示・非表示の UI を処理します。

    @Override
    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
        if (isInPictureInPictureMode) {
            // PiP モードに入るときの処理
            // UI を非表示にする
            Log.e(TAG, "PiP モードに入ります");
        } else {
            // PiP モードを終了するときの処理
            // UI を表示する
            Log.e(TAG, "PiP モードを終了します");
        }
    }

ライブ RTS フォールバック

説明

詳細なコード例については、API-ExampleRtsLiveStream モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for Android のコア機能を迅速に統合するための Java ベースのサンプルプロジェクトです。

詳細については、「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
 *
 */
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/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. ApsaraVideo Player SDK または All-in-One SDK のバージョンが 7.6.0 以降であること。

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

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

プラグインの統合

Player SDK

Maven 統合 (推奨)

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

説明

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

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

ローカル統合

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

All-in-One SDK

Maven 統合

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

// x.x.x は使用している All-in-One SDK のバージョン番号と一致する必要があります
com.aliyun.sdk.android:AlivcVVCCodec:x.x.x-aio

プラグインのアクティベート

説明

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

AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);

関連エラーコード

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

再生ソースの自動更新

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

前提条件

  1. ApsaraVideo Player SDK または All-in-One SDK のバージョンが 7.9.0 以降であること。

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

VidAuth ソース

API 操作の例

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

機能コンポーネント

機能コンポーネント

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

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

/**
 * 再生ソースの更新結果を処理するためのコールバックインターフェイス。
 *
 * このインターフェイスは、URL ソースや VidAuth ソースなど、動的な更新が必要な再生ソースタイプに適用されます。
 * プレーヤーが更新リクエストをトリガーすると、`onSuccess` または `onError` メソッドのいずれかを呼び出すことで、
 * このインターフェイスを介して更新結果を返すことができます。
 */
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, UrlPlayer.SourceRefreshCallback<VidAuth> sourceRefreshCallback) {
        
        String vid = vidAuth.getVid();

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

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

UrlSource ソース

API 操作の例

/**
 * URL ソースの有効期限イベントのリスナーを設定します。
 *
 * この機能により、認証による URL の有効期限切れによる再生の中断を回避するための
 * URL 更新が可能になります。リスナーがトリガーされると、URL ソースを更新し、
 * 更新された URL ソースを {@link SourceRefreshCallback#onSuccess} を使用して返すことができます。
 *
 * @param listener URL ソースの有効期限イベントを処理するためのリスナー。{@link OnURLSourceExpiredListener} をご参照ください。
 *
 * <p>URL 認証の設定に関する詳細については、
 * <a href="https://www.alibabacloud.com/help/document_detail/vod/user-guide/configure-url-signing.html?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 ソースを更新し、新しい UrlSource を
     * {@link SourceRefreshCallback#onSuccess} を使用して返すことができます。
     *
     * @param expiredSource 期限切れの UrlSource オブジェクト。{@link UrlSource} を参照してください。
     * @param callback 更新された UrlSource をプレーヤーに返すために使用される更新コールバック。{@link SourceRefreshCallback} を参照してください。
     */
    void onUrlSourceExpired(UrlSource expiredSource, SourceRefreshCallback<UrlSource> callback);
}

使用方法

// プレーヤーの URL 有効期限リスナーを設定
mAliyunVodPlayer.setOnURLSourceExpiredListener(new UrlPlayer.OnURLSourceExpiredListener() {
    @Override
    public void onUrlSourceExpired(UrlSource urlSource, UrlPlayer.SourceRefreshCallback<UrlSource> sourceRefreshCallback) {
        String expiredUrl = urlSource.getUri();
        Log.d(TAG, "[onUrlSourceExpired] 期限切れの 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);
    }
}

パフォーマンス

再生シナリオの設定

再生シナリオを設定すると、そのシナリオに最適なパラメーター (バッファー設定、機能スイッチなど) が自動的に設定されます。また、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-ExamplePreload モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for Android のコア機能を迅速に統合するための Java ベースのサンプルプロジェクトです。

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 です。クリーンアップ中に、合計キャッシュサイズがこの制限を超えた場合、最終アクセス時間でソートされた最も古いキャッシュファイルが、合計サイズが最大容量以下になるまで 1 つずつ削除されます。
 * @param freeStorageMB - 最小空きディスク領域 (MB)。デフォルトは 0 です。クリーンアップ中に、maxCapacityMB と同様に、現在のディスク領域がこの値より小さい場合、ルールに従ってキャッシュファイルが 1 つずつ削除され、空きストレージがこの値以上になるか、すべてのキャッシュがクリアされるまで続きます。
 * 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 ビデオの場合、その keyURL から認証パラメーターを削除してハッシュ値を計算するように処理されると、異なるビデオのキャッシュが同じキーにヒットしてしまい、再生に失敗する可能性があります。解決策: setCacheUrlHashCallback のコールバックでドメイン名チェックを実行し、再生ドメイン (http(s)://xxxxx.m3u8?aaaa) の認証パラメーターのみを削除し、keyURL に対応するドメイン (http(s)://yyyyy?bbbb) からは削除しません。进阶功能-本地缓存.png

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

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

    • ビデオ再生 URL が https://****.mp4 の場合は、http://****.mp4 に統一してからハッシュ値を計算します。

  • プレーヤー SDK バージョン 5.5.4.0 以降では、ビデオ再生 URL に認証パラメーターがあり、再生プロトコルが HLS の場合、PlayerConfig.mEnableStrictAuthMode フィールドを設定して、さまざまな認証モードを選択できます (バージョン 5.5.4.0 から 6.21.0 までのデフォルト値は false です。バージョン 7.0.0 以降のデフォルト値は true です):

    • 非厳密認証 (false):認証もキャッシュされます。前回メディアの一部のみがキャッシュされた場合、プレーヤーは次回キャッシュされていない部分を再生する際にキャッシュされた認証を使用してリクエストを行います。URL 認証の有効期間が非常に短い場合、再生例外が発生します。

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

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

単一 URL のローカルキャッシュ機能を有効または無効にしたい場合は、PlayerConfig で設定できます。

// まず、設定を取得します
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 情報");// 必須。ビデオ ID (VideoId)。
    vidAuth.setPlayAuth("<yourPlayAuth>");// 必須。再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth API 操作を呼び出して生成する必要があります。
    vidAuth.setRegion("アクセスリージョン");// プレーヤー SDK V5.5.5.0 以降では、このパラメーターは非推奨です。リージョンを設定する必要はなく、プレーヤーが自動的に解析します。プレーヤー SDK バージョン 5.5.5.0 より前では、このパラメーターは必須です。ApsaraVideo VOD のアクセスリージョンで、デフォルトは cn-shanghai です。
    vidAuth.setQuality("選択された解像度") //"AUTO" はアダプティブビットレートを表します

    VidSts

    VidSts vidSts = new VidSts();
    vidSts.setVid("Vid 情報");// 必須。ビデオ 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("アクセスリージョン");// 必須。ApsaraVideo VOD のアクセスリージョンで、デフォルトは cn-shanghai です。
    vidSts.setQuality("選択された解像度") //"AUTO" はアダプティブビットレートを表します

    UrlSource

    UrlSource urlSource = new UrlSource();
    urlSource.setUri("再生 URL");// 必須。再生 URL。サードパーティの VOD URL または ApsaraVideo VOD の再生 URL を指定できます。
  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. 任意: ロードされたファイルの削除

    必要に応じてロードされたファイルを削除して、スペースを節約できます。ApsaraVideo Player SDK for Android は削除インターフェイスを提供していません。アプリの読み込みディレクトリ内のファイルを削除する必要があります。

動的プリロード

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

コードを表示するには、ここをクリックします

// 推奨設定と動的プリロードを有効にします。
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),

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

  /**
   * 初回フレームと再生のスムーズさのバランスを取ります。ビデオビットレートは切り替え前後 (moveToNext) で一貫しており、初回フレームのパフォーマンスも考慮されます。
   */
  MultiBitratesMode_FC_AND_SMOOTH(2),

  /**
   * 再生スムーズさ優先。ビデオはデフォルトで前のビデオのビットレートで再生を開始します。
   */
  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);
    }
});

ダウンロード速度の取得

getExtraValue API 操作を使用して、onInfo コールバックから現在再生中のビデオのダウンロード速度を取得できます。コード例を次に示します。

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

ネットワーク機能

HTTPDNS

HTTPDNS は、特定の HTTPDNS サーバーにドメイン名解決リクエストを送信して、より高速で安定したドメイン名解決結果を取得し、DNS ハイジャックのリスクを軽減します。

ApsaraVideo Player SDK は、Alibaba Cloud CDN ドメイン名専用の HTTPDNS サービスを提供する拡張 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] で、port はオプションです。複数のドメイン名を区切るにはセミコロン (;) を使用します
// グローバル設定
// 完全なインターフェイスは、各設定の標準として現在の文字列を使用します (多い場合は追加、少ない場合は削除)。空の文字列は事前接続を停止します
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");

ビデオダウンロード

説明

詳細なコード例については、API-ExampleDownload モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for Android のコア機能を迅速に統合するための Java ベースのサンプルプロジェクトです。

ApsaraVideo Player SDK for Android は、ApsaraVideo VOD の動画ダウンロード機能を提供します。これにより、ユーザーは動画をローカルにキャッシュして、ApsaraVideo Player を使用してオフラインで視聴できます。また、通常ダウンロードとセキュアダウンロードの 2 つのダウンロード方法を提供します。

  • 通常ダウンロード

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

  • セキュアダウンロード

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

説明

  • 動画ダウンロード機能は、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("your_video_id"); // ビデオ ID。
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // 一時的な STS トークンの AccessKey ID。トークンを取得するには、STS の AssumeRole 操作を呼び出す必要があります。
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // 一時的な STS トークンの AccessKey Secret。トークンを取得するには、STS の AssumeRole 操作を呼び出す必要があります。
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // セキュリティトークン。トークンを取得するには、STS の AssumeRole 操作を呼び出す必要があります。
      aliyunVidSts.setRegion("your_region_id"); // VOD がアクティベートされているリージョンの ID。デフォルト値:cn-shanghai。
       // VOD コンソールでパラメーターパススルー付きの HLS 暗号化を有効にし、デフォルトのパラメーター名が MtsHlsUriToken の場合、config パラメーターを設定して VidSts オブジェクトに渡す必要があります。詳細については、次のコードをご参照ください。
       // VOD コンソールでパラメーターパススルー付きの HLS 暗号化を有効にしていない場合、次のコードを統合する必要はありません。
       VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
       vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
       aliyunVidSts.setPlayerConfig(vidConfig);
              
      
      // ダウンロードソースを準備します。
      mAliDownloader.prepare(aliyunVidSts);
    • VidAuth

      // VidAuth オブジェクトを作成します。
      VidAuth vidAuth = new VidAuth();
      vidAuth.setVid("あなたのビデオ ID");// ビデオ ID (VideoId)。
      vidAuth.setPlayAuth("<yourPlayAuth>");// 再生認証情報。VOD サービスの GetVideoPlayAuth 操作を呼び出して認証情報を生成する必要があります。
      vidAuth.setRegion("リージョン");// プレーヤー SDK V5.5.5.0 以降では、このパラメーターは非推奨です。プレーヤーが自動的にリージョンを解析するため、リージョンを設定する必要はありません。プレーヤー SDK V5.5.5.0 より前のバージョンでは、このパラメーターは必須です。VOD サービスがアクティベートされているリージョンを指定します。デフォルト値は cn-shanghai です。
      // VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にし、デフォルトのパラメーター名が MtsHlsUriToken の場合、config を設定して VidAuth オブジェクトに渡す必要があります。詳細については、次のコードをご参照ください。
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(vidConfig);
      // ダウンロードソースを準備します。
      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. ダウンロードが成功または失敗した後、ダウンローダーを解放します。

    ダウンロードが完了した後、onCompletion または onError コールバックで release を呼び出してダウンローダーを解放できます。コード例を次に示します。

    mAliDownloader.stop();
    mAliDownloader.release();
  8. 任意: ダウンロードしたファイルの削除

    ダウンロード中またはダウンロード後に、ダウンロードしたファイルを削除できます。コード例は次のとおりです。

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

次のステップ

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

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

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

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

暗号化ビデオ再生

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

ネイティブ RTS 再生

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

リファレンス