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

ApsaraVideo VOD:高度な機能

最終更新日:Dec 17, 2025

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

重要

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

Professional Competence Verification

説明

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());
    // traceId は、IMEI や IDFA などのデバイスまたはユーザーの一意の識別子です。
    aliListPlayer.setTraceId("traceId");

  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 を取得できます。動画再生 URL を取得するには、ApsaraVideo VOD サーバーサイド SDK を統合することを推奨します。この方法では、URL に署名する必要がありません。API を呼び出して動画再生 URL を取得する方法の詳細については、「デベロッパーポータル」をご参照ください。

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

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

    uid は動画の一意の識別子です。再生中にストリームのクロストークが発生した場合は、異なる動画に同じ uid が使用されていないか確認してください。uid は任意の文字列にすることができます。

  5. 表示ビューの設定

    プレーヤーは SurfaceView と TextureView をサポートしています。どちらかを選択できます。

    • SurfaceView の設定。コード例は次のとおりです。

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

      SurfaceView surfaceView = findViewById(R.id.surface_view);
      surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
          @Override
          public void surfaceCreated(SurfaceHolder holder) {
              aliListPlayer.setSurface(holder.getSurface());
          }
      
          @Override
          public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
              aliListPlayer.surfaceChanged();
          }
      
          @Override
          public void surfaceDestroyed(SurfaceHolder holder) {
              aliListPlayer.setSurface(null);
          }
      });
    • TextureView の設定。コード例は次のとおりです。

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

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

    1 つ以上の再生ソースを追加して自動再生を有効にした後、moveTo を呼び出してビデオソースを再生できます。以下にコード例を示します。

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

    // 自動再生を有効にします。
    aliListPlayer.setAutoPlay(true);
    
    // URL にはこの API 操作を使用します。
    aliPlayer.moveTo(String uid);
    // VID にはこの API 操作を使用します。stsInfo (一時的な STS トークンと AccessKey ペア) を渡す必要があります。事前に取得しておく必要があります。詳細については、「RAM ロールを作成し、STS を使用して一時的なアクセス許可を付与する」をご参照ください。
    aliPlayer.moveTo(String uid, StsInfo info);
  7. 前または次のビデオの再生

    • moveTo を呼び出してビデオソースを再生した後、moveTo の呼び出しのビデオソースをリファレンスとして、moveToPrev および moveToNext API 操作を呼び出して、前後のビデオを再生します。以下にコード例を示します。

      説明

      同じ view を使用する場合、moveto または moveToNext を呼び出して動画ソースを切り替えると、画面がちらついたり黒くなったりすることがあります。この場合、listPlayer を初期化する際に PlayerConfigmClearFrameWhenStop フィールドを false に設定し、setConfig を呼び出して設定を適用することを推奨します。

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

      // 自動再生を有効にします。
      aliListPlayer.setAutoPlay(true);
      
      // 次の動画に移動します。注:このメソッドは URL ソース専用です。VID 再生には適用されません。
      aliListPlayer.moveToNext();
      // 前の動画に移動します。注:このメソッドは URL ソース専用です。VID 再生には適用されません。
      aliListPlayer.moveToPrev();
      // 次の動画に移動します。注:このメソッドは VID 再生専用です。
      aliListPlayer.moveToNext(StsInfo info);
      // 前の動画に移動します。注:このメソッドは VID 再生専用です。
      aliListPlayer.moveToPrev(StsInfo info);
説明

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

透明度のあるビデオの再生

機能説明

ApsaraVideo Player SDK は、アルファチャンネルのレンダリングをサポートし、透明なギフトアニメーションの動的な効果を実現します。ライブチャンネルなどのシナリオで、ライブコンテンツを隠すことなく透明なギフトアニメーションを再生することで、ユーザーの視聴体験とインタラクティブ体験が大幅に向上します。

制限事項

透明レンダリング機能は、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);

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

音声のみの再生

動画再生を無効にして音声のみを再生できます。プレーヤーを準備する前に 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 ソフトウェアデコーディングにフォールバックします。

説明
  • この機能は、クラウドとクライアントの機能を組み合わせたアダプティブデコーディングの付加価値サービスを有効にした後にのみ有効になります。ライセンスを申請するには、チケットを起票する必要があります。

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

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

次のコードは、バックアップストリームを設定する方法を示しています。

// アプリケーション層は、元の URL とバックアップ URL のすべてのキーと値のペアを格納するマップを維持します。切り替え時に、元の URL に基づいてマップ内のバックアップ URL が照会されます。
 AliPlayerGlobalSettings.setAdaptiveDecoderGetBackupURLCallback(new AliPlayerGlobalSettings.OnGetBackupUrlCallback() {
    @Override
    public String getBackupUrlCallback(int oriBizScene, int oriCodecType, String original_url) {
        String kurl = original_url;
        if (!H265toH264Map.get(kurl).isEmpty()) {
            return H265toH264Map.get(kurl);
        } else {
            return "";
        }
    }
});

ネットワーク状況に応じた動画解像度のアダプティブ切り替え

説明
  • マルチビットレートアダプティブ 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);

スナップショットの取得

Android 向け ApsaraVideo Player SDK は、再生中の動画のスナップショット機能を提供します。この機能は、snapshot API 操作によって実装されます。生データをキャプチャし、bitmap として返します。コールバックインターフェイスは OnSnapShotListener です。以下にコード例を示します。

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

プレビュー

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

プレビュー機能の設定後、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/ja/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 が V7.6.0 以降であること。

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

  3. H.266 デコーディングプラグインを備えた ApsaraVideo Player は、Alibaba Cloud Transcoding によってトランスコーディングされた H.266 動画の再生のみをサポートします。

プラグインの統合

ApsaraVideo 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 が V7.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/ja/vod/user-guide/configure-url-signing">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 は、ローカルキャッシュ機能を提供します。この機能は、ユーザーが動画を再再生する際の起動速度、シーク速度を向上させ、途切れを減らすと同時に、トラフィックも節約します。

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

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

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

// ローカルキャッシュを有効にします (デフォルトパス)。
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 のローカルキャッシュ機能を有効または無効にする場合は、player config で設定できます。

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

// プレーヤーの設定を行います。
aliPlayer.setConfig(config);

プリロード

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

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

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

説明

ApsaraVideo Player SDK for Android は、デフォルトでプリロードのための自動ネットワークリソーススケジューリング機能を提供します。これにより、プリロードのネットワークリクエストが再生中の動画のネットワークリクエストに与える影響を軽減します。自動スケジューリングポリシーは次のように機能します。現在再生中の動画のバッファーが特定のしきい値に達した後にのみ、プリロードがリクエストを行うことを許可します。プリロードのリアルタイムリクエストを自分で制御するには、次の方法でこのポリシーを無効にできます。

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

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

    VidAuth (推奨)

    VidAuth vidAuth = new VidAuth();
    vidAuth.setVid("Vid 情報"); // 必須。動画 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);

// ベースのプリロード時間を設定します。
// プリロード時間を 1000ms に設定します。
PreloadConfig config = new PreloadConfig();
config.mPreloadDuration = 1000;
aliListPlayer.updatePreloadConfig(config);

// プリロードするアイテム数を設定し、両方向をサポートします。
// 1 は後方にプリロードするアイテム数、3 は前方にプリロードするアイテム数です。
aliListPlayer.setPreloadCount(1, 3);

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

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

listPlayer + マルチビットレート HLS 動画再生シナリオでは、インテグレーターは現在再生中の動画と同じ解像度のストリームをプリロードできます。また、ビジネスニーズに基づいてプリロードモードを選択することもできます。

サポートされているプリロードモードを表示するには、ここをクリックします

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

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

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

  /**
   * 再生の滑らかさ優先。動画はデフォルトで前の動画のビットレートで再生を開始します。
   */
  MultiBitratesMode_SmoothPrio(3);

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

// マルチビットレート読み込みモードを選択します。
aliListPlayer.SetMultiBitratesMode(preLoadMode);


// (オプション) 起動ビットレートを選択します。
aliListPlayer.setDefaultBandWidth(defaultBandWidth)


// (オプション) onPrepared コールバックで、ABR モードを選択します。
aliListPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() {
    @Override
    public void onPrepared() {
        // ABR はマルチビットレート m3u8 にのみ影響します。
        aliListPlayer.selectTrack(-1);
    }
});

ダウンロード速度の取得

`onInfo` コールバックで、現在再生中の動画のダウンロード速度を取得できます。この取得には getExtraValue API 操作を使用します。次のコードはその例です。

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

ネットワーク機能

HTTPDNS

HTTPDNS は、特定の 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 クラスで一度設定することを推奨します。コード例は次のとおりです。

    // encryptedApp.dat ファイルを電話機に保存し、ここで暗号化ファイルのローカルファイルパスを設定することを推奨します。
    PrivateService.initService(getApplicationContext(),  "encryptedApp.dat があるファイルパス");
  2. ダウンローダーの作成と設定

    AliDownloaderFactory を使用してダウンローダーを作成できます。コード例は次のとおりです。

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

    ダウンローダーは複数のイベントリスナーを提供します。コード例は次のとおりです。

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

    mAliDownloader.setOnPreparedListener(new AliMediaDownloader.OnPreparedListener() {
       @Override
       public void onPrepared(MediaInfo mediaInfo) {
           // ダウンロードアイテムの準備が正常に完了しました。
       }
    });
    mAliDownloader.setOnProgressListener(new AliMediaDownloader.OnProgressListener() {
       @Override
       public void onDownloadingProgress(int percent) {
           // ダウンロードの進捗率。
       }
       @Override
       public void onProcessingProgress(int percent) {
           // 処理の進捗率。
       }
    });
    mAliDownloader.setOnErrorListener(new AliMediaDownloader.OnErrorListener() {
       @Override
       public void onError(ErrorInfo errorInfo) {
           // ダウンロードエラー。
       }
    });
    mAliDownloader.setOnCompletionListener(new AliMediaDownloader.OnCompletionListener() {
       @Override
       public void onCompletion() {
           // ダウンロード成功。
       }
    });
  4. ダウンロードソースの準備

    prepare メソッドを使用してダウンロードソースを準備できます。 ダウンロードソースは VidSts メソッドと VidAuth メソッドをサポートしています。 以下のコードは一例です。

    • VidSts

      // VidSts を作成します。
      VidSts aliyunVidSts = new VidSts();
      aliyunVidSts.setVid("Vid 情報"); // 動画 ID (VideoId)。
      aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // 一時的な STS トークンの AccessKey ID。STS の AssumeRole API 操作を呼び出して生成する必要があります。
      aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // 一時的な STS トークンの AccessKey Secret。STS の AssumeRole API 操作を呼び出して生成する必要があります。
      aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // STS セキュリティトークン。STS の AssumeRole API 操作を呼び出して生成する必要があります。
      aliyunVidSts.setRegion("アクセスリージョン"); // ApsaraVideo VOD のアクセスリージョンで、デフォルトは cn-shanghai です。
       // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしており、デフォルトのパラメーター名が MtsHlsUriToken の場合は、以下のように config を設定して vid に渡す必要があります。
       // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしていない場合は、以下のコードを統合する必要はありません。
       VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
       vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
       aliyunVidSts.setPlayerConfig(config);
              
      
      // ダウンロードソースを準備します。
      mAliDownloader.prepare(aliyunVidSts)
    • VidAuth

      // 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 です。
      // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしており、デフォルトのパラメーター名が MtsHlsUriToken の場合は、以下のように config を設定して vid に渡す必要があります。
      VidPlayerConfigGen vidConfig = new VidPlayerConfigGen();
      vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>");
      vidAuth.setPlayerConfig(config);
      // ダウンロードソースを準備します。
      mAliDownloader.prepare(vidAuth);
    説明
    • ソースファイルのフォーマットと出力ダウンロードファイルのフォーマットは同じで、変更できません。

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

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

    準備が成功すると、OnPreparedListener メソッドがコールバックされます。返された TrackInfo オブジェクトには、各ビデオストリームの解像度などの情報が含まれています。ダウンロードするトラックを選択できます。以下のコードは一例です。

    public void onPrepared(MediaInfo mediaInfo) {
        // ダウンロードアイテムの準備が正常に完了しました。
        List<TrackInfo> trackInfos = mediaInfo.getTrackInfos();
        // 例えば、最初の TrackInfo をダウンロードします。
        mAliDownloader.selectItem(trackInfos.get(0).getIndex());
        // ダウンロードを開始します。
        mAliDownloader.start();
    }
  6. (任意) ダウンロードソースの更新

    VidSts と VidAuth の有効期限が切れるのを防ぐために、ダウンロードを開始する前にダウンロードソース情報を更新することもできます。コード例は次のとおりです。

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

    ダウンロードの完了後、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 ストリームプルを実装する」をご参照ください。

関連ドキュメント