このトピックでは、ApsaraVideo Player SDK for Android の高度な機能の使用方法について説明し、コード例を提供します。その他の機能の詳細については、「API リファレンス」をご参照ください。
専門能力を確認する
ApsaraVideo Player の一部の機能には Professional Edition のライセンスが必要です。詳細については、「ApsaraVideo Player SDK の機能」をご参照ください。これらの機能を使用するには、Professional Edition のライセンスを取得する必要があります。詳細については、「ApsaraVideo Player SDK のライセンス取得」をご参照ください。
アプリケーション起動時またはプレーヤー API を呼び出す前にリスナーを設定します。
import com.aliyun.private_service.PrivateService;
PrivateService.setOnPremiumLicenseVerifyCallback(new PrivateService.OnPremiumLicenseVerifyCallback() {
@Override
public void onPremiumLicenseVerifyCallback(PrivateService.PremiumBizType type, boolean isValid, String errorMsg) {
Log.d(TAG, "onPremiumLicenseVerifyCallback: " + type + " isValid: " + isValid + " errorMsg: " + errorMsg);
}
});上記コードにおける PremiumBizType は、プロフェッショナル機能の列挙型です。関連機能を使用すると、プレーヤーがライセンスを検証し、このコールバックを通じて結果を返します。isValid が false の場合、errorMsg に具体的な理由が含まれます。
再生
リスト再生
ApsaraVideo Player SDK for Android は、動画用の本格的なリスト再生機能を提供します。SDK はプリロードなどの技術を活用して、短尺動画の読み込み時間を最小限に抑えます。
より良いリスト再生体験を得るために、ミニドラマソリューションの使用を推奨します。詳細については、「ミニドラマのクライアント側開発」をご参照ください。
透明度付き動画の再生
機能概要
ApsaraVideo Player SDK はアルファチャネルのレンダリングをサポートしており、透明度付きのダイナミックギフトエフェクトを再生できます。ライブチャンネルなどのシナリオでは、透明度付きのダイナミックギフトエフェクトを再生してもライブコンテンツが遮られず、ユーザーの視聴およびインタラクティブ体験が大幅に向上します。
制限事項
ApsaraVideo MediaBox SDK V6.8.0 以降および ApsaraVideo Player SDK V6.9.0 以降で、透明度レンダリングがサポートされています。
メリット
透明度情報を含む MP4 動画をギフトエフェクトとして使用することで、アニメーション品質の向上、ファイルサイズの小型化、互換性の向上、開発効率の向上が実現します。これにより、ギフトエフェクトをユーザーにより良く表示でき、ユーザーエクスペリエンスが向上します。
アニメーション品質の向上:MP4 動画は元のアニメーション品質(詳細や色を含む)を保持できます。APNG や IXD などの他のフォーマットと比較して、MP4 はデザイナーが作成したアニメーションエフェクトをより正確に再現できます。
ファイルサイズの小型化:MP4 動画ファイルは、APNG や IXD などの他のフォーマットよりも効率的に圧縮できます。これにより、読み込み速度が向上し、ネットワーク帯域幅の消費が削減されます。
互換性の向上:MP4 は汎用的な動画フォーマットであり、さまざまなデバイスおよびブラウザで広くサポートされています。主流のデバイスでギフトエフェクトの再生および表示が可能です。
開発効率の向上:MP4 動画をギフトエフェクトとして使用する技術ソリューションは比較的シンプルです。開発者は複雑な解析およびレンダリングロジックを研究および実装する必要がなく、他の機能の実装に集中して開発効率を向上させられます。
外部字幕
詳細なコード例については、「API-Example」の 外部字幕デモおよび切り替え (ExternalSubtitle) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。
ApsaraVideo Player SDK for Android は、外部字幕の追加および切り替えをサポートしています。現在、SRT、SSA、ASS、VTT 形式の字幕をサポートしています。
以下に例を示します。
字幕を表示するビューを作成します。
字幕フォーマットごとに異なるビューを作成します。
プレーヤー 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); } });字幕を追加します。
重要字幕ファイルは
onPreparedで設定する必要があります。mAliPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { // 字幕設定 (onPrepared で設定する必要があります)。 mAliPlayer.addExtSubtitle(EXT_SUBTITLE_URL); } });字幕関連のリスナーを設定します。
外部字幕 (レンダリングコンポーネントに基づくカスタムレンダリング)
VttSubtitleView および WebVttResolver をベースに、WebVTT 外部字幕を完全にサポートし、フォントサイズ、色、特定のフォントを柔軟にカスタマイズできます。
シナリオ:
WebVTT 字幕スタイルをカスタマイズする必要があります。
ApsaraVideo Player SDK V7.11.0 以降を統合しています。
前提条件:
フォントファイル (.ttf) がプロジェクトの
assets/fonts/ディレクトリに配置されています。プロジェクトの minSdk が 21 以上です (推奨)。
字幕リスナーが追加されており、WebVTT コンテンツを取得できます。
CustomStyleWebVttResolverを作成し、WebVttResolverを実装します。public class CustomStyleWebVttResolver extends WebVttResolver { // 作成メソッドを実装します。 public CustomStyleWebVttResolver(Context context) { super(context); // 後ほどフォントおよびその他のリソースを初期化します。 } }applyTextSpansをオーバーライドして、スタイルのカスタマイズを実装します。このメソッドは、親クラスが基本スタイルを解析した後に呼び出され、字幕に対して二次処理を実行できます。
方法 1:
VttContentAttributeを変更し、親クラスのメソッドを呼び出して操作を実行します。/** * テキストスタイル適用ロジックをオーバーライドして、カスタムスタイル効果を実現します。 * このメソッドは、親クラスが基本スタイルを解析した後に呼び出され、フォントサイズや色などのプロパティに対して二次処理を実行できます。 * * @param spannableStringBuilder スタイル付きテキストを構築するために使用します。 * @param vttContentAttribute 現在のテキストセグメントのスタイル属性オブジェクト (フォント、色、サイズなどを含む)。 * @param start スタイル適用の開始位置 (包含)。 * @param end スタイル適用の終了位置 (非包含)。 */ @Override protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) { // 設定 // 後での調整のために元のフォントサイズ (px 単位) を保存します。 // フォントサイズのデフォルト値は、動画の高さの 0.0533 倍です。 double originalFontSizePx = vttContentAttribute.fontSizePx; // フォントを 2 倍に拡大します。 vttContentAttribute.fontSizePx = originalFontSizePx * 2; // フォントの色を赤に変更します。 vttContentAttribute.mPrimaryColour = Color.argb(255, 255, 0, 0); // 親クラスのメソッドを呼び出してテキストを適用します。 super.applyTextSpans(spannableStringBuilder, vttContentAttribute, start, end); }SpannableStringBuilderを直接操作して、WebVTT スタイルを直接変更します。重要この方法では、ネイティブの WebVtt スタイルが失われる可能性があります。
/** * テキストスタイル適用ロジックをオーバーライドして、カスタムスタイル効果を実現します。 * このメソッドは、親クラスが基本スタイルを解析した後に呼び出され、フォントサイズや色などのプロパティに対して二次処理を実行できます。 * * @param spannableStringBuilder スタイル付きテキストを構築するために使用します。 * @param vttContentAttribute 現在のテキストセグメントのスタイル属性オブジェクト (フォント、色、サイズなどを含む)。 * @param start スタイル適用の開始位置 (包含)。 * @param end スタイル適用の終了位置 (非包含)。 */ @Override protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) { // フォントの色を設定します。 spannableStringBuilder.setSpan( new ForegroundColorSpan(Color.RED), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ); // 絶対サイズを設定します。 spannableStringBuilder.setSpan( new AbsoluteSizeSpan(20), // 単位:px start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ); // 相対サイズを設定します。 // spannableStringBuilder.setSpan( // new RelativeSizeSpan(2.0f), // TextView のデフォルトフォントサイズの倍率。 // start, end, // Spanned.SPAN_EXCLUSIVE_EXCLUSIVE // ); }
カスタムフォント (Typeface) を設定します。
プロジェクトの
asset/fonts/ディレクトリからカスタムフォントを読み込みます。private Typeface mTypeface; public CustomStyleWebVttResolver(Context context) { super(context); initializeFonts(context); } private void initializeFonts(Context context) { try { // assets/fonts/ からフォントを読み込みます。 mTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/LongCang.ttf"); } catch (Exception e) { Log.e("Font", "Failed to load font", e); mTypeface = Typeface.DEFAULT; // 安全なフォールバック。 } }カスタムフォントを字幕に適用します。
@Override protected void applyTextSpans(SpannableStringBuilder builder, VttContentAttribute attr, int start, int end) { // カスタムフォントを適用します。 // 親クラスによって設定されたフォントをオーバーライドするために、super.applyTextSpans() の後に配置する必要があります。 // super.applyTextSpans() を呼び出す必要はありません。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { builder.setSpan(new TypefaceSpan(mTypeface), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else { builder.setSpan(new CustomTypefaceSpan(mTypeface), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } }古い Android バージョンとの互換性:Android P (API 28) 未満のバージョンでは、
TypefaceSpanが直接Typefaceオブジェクトを渡すことをサポートしていないため、カスタムMetricAffectingSpanを定義する必要があります。/** * カスタム Typeface Span クラス。 * MetricAffectingSpan を継承し、テキスト描画および測定中に Typeface を正しく適用します。 * 標準の TypefaceSpan が Typeface オブジェクトを直接使用できない問題を解決します。 */ private static class CustomTypefaceSpan extends MetricAffectingSpan { // 適用するカスタムフォント。 private final Typeface typeface; /** * コンストラクター。 * * @param typeface 適用する Typeface オブジェクト (null にできません)。 */ public CustomTypefaceSpan(Typeface typeface) { this.typeface = typeface; } /** * テキスト描画状態を更新します。 * テキストが実際に描画されるときに呼び出され、ペイントのフォントを設定します。 * * @param tp テキスト描画に使用される TextPaint オブジェクト。 */ @Override public void updateDrawState(TextPaint tp) { tp.setTypeface(typeface); } /** * テキスト測定状態を更新します。 * テキストレイアウト (幅、改行など) を計算するときに呼び出され、測定結果が実際の描画と一致することを保証します。 * * @param p テキスト測定に使用される TextPaint オブジェクト。 */ @Override public void updateMeasureState(TextPaint p) { p.setTypeface(typeface); } }
プレーヤーに統合します。
字幕ビューを初期化します。
// 字幕ビューを初期化します。 private void initSubtitleView() { // コンテキストを取得します。 Context context = getContext(); // CustomStyleWebVttResolver を作成します。 CustomStyleWebVttResolver mResolver = new CustomStyleWebVttResolver(context); // VttSubtitleView を作成し、CustomStyleWebVttResolver を渡します。 VttSubtitleView mVttSubtitleView = new VttSubtitleView(context, mResolver); // 動画コンテナーに追加します。 rootView.addView(mVttSubtitleView); }外部字幕コールバックをバインドします。
// 字幕リスナーを設定します。 mAliPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() { @Override public void onSubtitleExtAdded(int trackIndex, String url) { mAliPlayer.selectExtSubtitle(trackIndex, true); } @Override public void onSubtitleShow(int trackIndex, long id, String data) { if (mVttSubtitleView != null) { // 字幕を表示します。 mVttSubtitleView.show(id, data); } } @Override public void onSubtitleHide(int trackIndex, long id) { // 字幕を非表示にします。 mVttSubtitleView.dismiss(id); } @Override public void onSubtitleHeader(int i, String header) { if (!TextUtils.isEmpty(header)) { // WebVTT ヘッダースタイルを適用します。 mVttSubtitleView.setVttHeader(header); } } });
音声のみ再生
動画再生を無効にして、音声のみの効果を実現できます。プレーヤーの準備前に PlayerConfig を設定します。
PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true; // 音声のみ再生を有効に設定します。
aliPlayer.setConfig(config);ソフトウェアデコーディングとハードウェアデコーディングの切り替え
デコーディング方法は再生開始前に切り替える必要があります。再生中にデコーディング方法を切り替えても効果はありません。
ApsaraVideo Player SDK for Android は、H.264 および H.265 に対するハードウェアデコーディング機能を提供し、enableHardwareDecoder による切り替えを提供します。デフォルトで有効になっています。ハードウェアデコーディングの初期化に失敗した場合、自動的にソフトウェアデコーディングに切り替わって、動画再生が正常に行われるようにします。サンプルコード:
// ハードウェアデコーディングを有効にします。デフォルトで有効になっています。
aliPlayer.enableHardwareDecoder(true);システムがハードウェアデコーディングからソフトウェアデコーディングに自動的に切り替えた場合、onInfo コールバックがトリガーされます。以下の例を参照してください。
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
// ソフトウェアデコーディングに切り替えます。
}
}
});H.265 アダプティブ再生
現在のデバイスモデルがクラウドベースの H.265 ブラックリストに含まれている場合、または H.265 ストリームのハードウェアデコーディングに失敗した場合、アダプティブ劣化がトリガーされます。劣化プロセスは次のとおりです。H.264 バックアップストリームが設定されている場合は、自動的に再生されます。H.264 バックアップストリームが設定されていない場合は、プレーヤーが自動的に H.265 ソフトウェアデコーディングに劣化します。
この機能は、クラウドとクライアントを組み合わせたアダプティブデコーディングの付加価値サービスを有効にした後でのみ使用できます。Yida フォームを送信してライセンスを申請する必要があります。
クラウドとクライアントを組み合わせたアダプティブデコーディングの付加価値サービスには、主に次の内容が含まれます。1. クラウドベースのハードウェアデコーディング互換性データの動的配信。2. H.265 ストリームから H.264 ストリームへのアダプティブ劣化。
付加価値サービスを有効にしていなくても、ハードウェアデコーディングに失敗した場合に自動的にソフトウェアデコーディングに切り替える機能は SDK に備わっています。
バックアップストリームを設定します。サンプルコード:
// アプリケーション層は、すべての元の URL とバックアップ URL のキーと値のペアを格納する Map を維持します。切り替え時に、元の URL に基づいて Map からバックアップ URL を照会します。
AliPlayerGlobalSettings.setAdaptiveDecoderGetBackupURLCallback(new AliPlayerGlobalSettings.OnGetBackupUrlCallback() {
@Override
public String getBackupUrlCallback(int oriBizScene, int oriCodecType, String original_url) {
String kurl = original_url;
if (!H265toH264Map.get(kurl).isEmpty()) {
return H265toH264Map.get(kurl);
} else {
return "";
}
}
});ネットワーク状況に基づくアダプティブビットレートストリーミング
HLS アダプティブビットレート動画ストリームは、ApsaraVideo VOD で動画パッケージングトランスコーディングテンプレートグループを使用してトランスコードすることで生成できます。詳細については、「ビデオオンデマンドのアダプティブビットレートストリーミング設定」をご参照ください。
ApsaraVideo VOD トランスコーディングによって生成されたアダプティブストリームの場合、Vid ベースの再生を使用する際に、デフォルトの再生画質リストを
DEFINITION_AUTOとして指定する必要があります。そうしないと、プレーヤーはデフォルトロジックに従って低画質の動画ストリームを選択して再生します。画質のデフォルト再生順序については、「動画が複数の画質にトランスコードされた場合、プレーヤー SDK はデフォルトでどの画質を再生しますか?」をご参照ください。以下は、VidAuth 再生の画質リストを指定する例です。VidAuth vidAuth = new VidAuth(); List<Definition> list = new ArrayList<>(); list.add(Definition.DEFINITION_AUTO); vidAuth.setDefinition(list);
ApsaraVideo Player SDK for Android は、アダプティブビットレート HLS および DASH 動画ストリームをサポートしています。prepare が成功した後、getMediaInfo を使用して、各ビットレートストリームの情報を取得できます。これは TrackInfo です。サンプルコード:
List<TrackInfo> trackInfos = aliPlayer.getMediaInfo().getTrackInfos();再生中に、プレーヤーの selectTrack メソッドを呼び出してストリームを切り替えることができます。トラックを AUTO_SELECT_INDEX に設定すると、アダプティブビットレートストリーミングが有効になります。例:
int index = trackInfo.getIndex();
// ビットレートを切り替えます。
aliPlayer.selectTrack(index);
// アダプティブビットレートストリーミングを有効にします。
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);切り替え結果は、OnTrackChangedListener へのコールバックで返されます。selectTrack を呼び出す前に設定しておく必要があります。以下に例を示します。
aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
@Override
public void onChangedSuccess(TrackInfo trackInfo) {
// ビットレート切り替えが成功しました。
}
@Override
public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
// ビットレート切り替えに失敗しました。errorInfo.getMsg() メソッドを呼び出して失敗の原因を特定できます。
}
});オプション: プレーヤーの selectTrack メソッドを呼び出して再生ビットレートをアダプティブに切り替える前に、config を通じて ABR 切り替え画質の上限を設定して、予期しないビットレートに自動的に切り替わるのを防ぐことができます。サンプルコード:(プレーヤーが prepare メソッドを呼び出す前、またはリストプレーヤーが moveTo メソッドを呼び出す前に以下のコードを呼び出すことを推奨します。)
PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; // ABR 画質上限に対応するピクセル数を 921600 (長さ × 幅 = 1280 × 720) に設定します。これにより、ABR で許可される画質のピクセル数がこの値以下になります。
aliPlayer.setConfig(config);スナップショット
ApsaraVideo Player SDK for Android は、現在の動画のスナップショットを取得する機能を提供します。snapshot API によって実装され、生データをキャプチャして bitmap として返します。コールバックインターフェイスは OnSnapShotListener です。サンプルコード:
// スナップショットコールバックを設定します。
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
@Override
public void onSnapShot(Bitmap bm, int with, int height){
// 取得した bitmap および画像の幅と高さ。
}
});
// 現在の再生フレームのスナップショットを取得します。
aliPlayer.snapshot();プレビュー
ApsaraVideo Player SDK for Android は、ApsaraVideo VOD サービスの設定と連携してプレビュー機能を実装できます。VidSts および VidAuth (ApsaraVideo VOD では推奨) の再生方法をサポートしています。プレビュー機能の設定および使用方法については、「動画のプレビュー」をご参照ください。
プレビュー機能を設定した後、プレーヤーのプレビュー期間を設定するために VidPlayerConfigGen.setPreviewTime() メソッドを使用します。以下は、VidSts 再生方法の例です。
VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// 20 秒プレビュー
vidSts.setPlayConfig(configGen);// 再生ソースに設定します。
...プレビュー期間が設定されている場合、ApsaraVideo Player SDK for Android を使用して動画を再生すると、サーバーは完全な動画コンテンツを返しません。代わりに、プレビュー時間分のコンテンツを返します。
VidPlayerConfigGen は、サーバーがサポートするリクエストパラメーターの設定をサポートしています。詳細については、「リクエストパラメーター」をご参照ください。
FLV および MP3 形式の動画は、現在プレビューをサポートしていません。
ブラックリストの設定
ApsaraVideo Player SDK for Android は、ハードウェアデコーディングのブラックリストメカニズムを提供します。ハードウェアデコーディングを使用できないことがわかっているデバイスについては、ソフトウェアデコーディングを直接使用して、無効な操作を回避できます。サンプルコード:
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );アプリが閉じられると、ブラックリストは自動的に無効になります。
Referer の設定
ApsaraVideo Player SDK for Android は Referer の設定をサポートしています。コンソールの Referer ブラックリストおよびホワイトリストと連携して、アクセス権限を制御できます。PlayerConfig メソッドを使用してリクエストの Referer を設定します。以下は、プレーヤー SDK 設定の例です。
// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// referer を設定します (例:http://example.aliyundoc.com)。(注:referer を設定する際は、先頭にプロトコル部分を含める必要があります。)
config.mReferrer = referrer;
....// その他の設定
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);User-Agent の設定
ApsaraVideo Player SDK for Android は、PlayerConfig を使用してリクエスト UA を設定します。設定後、プレーヤーのリクエストには UA 情報が含まれます。サンプルコード:
// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// UA を設定します。
config.mUserAgent = "UserAgent to be set";
....// その他の設定
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);ネットワークリトライ時間および回数の設定
ApsaraVideo Player SDK for Android のネットワークタイムアウトおよびリトライ回数は、PlayerConfig メソッドを使用して設定できます。サンプルコード:
// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ネットワークタイムアウトを設定します (単位:ミリ秒)。
config.mNetworkTimeout = 5000;
// タイムアウトリトライ回数を設定します。各リトライの間隔は networkTimeout です。networkRetryCount=0 の場合、リトライは行われず、リトライポリシーはアプリで決定されます。デフォルト値は 2 です。
config.mNetworkRetryCount=2;
....// その他の設定
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);NetworkRetryCount が設定されており、ネットワークの問題により読み込み状態になった場合、NetworkRetryCount 回リトライされ、各間隔は mNetworkTimeout になります。
複数回リトライしても読み込み状態が続く場合、
onErrorイベントがコールバックされます。このとき、ErrorInfo.getCode()=ErrorCode.ERROR_LOADING_TIMEOUT になります。NetworkRetryCount が 0 に設定されている場合、ネットワークリトライがタイムアウトすると、プレーヤーは
onInfoイベントをコールバックし、イベントの InfoBean.getCode()=InfoCode.NetworkRetry になります。このとき、プレーヤーのreloadメソッドを呼び出してネットワークを再読み込みするか、他のアクションを実行できます。
キャッシュおよび遅延制御の設定
ApsaraVideo Player SDK for Android は、PlayerConfig を通じてキャッシュおよび遅延を制御するインターフェイスを提供します。サンプルコード:
HTTP ヘッダーの設定
PlayerConfig メソッドを使用して、プレーヤーのリクエストに HTTP ヘッダーパラメーターを追加できます。サンプルコード:
// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ヘッダーを定義します。
String[] headers = new String[1];
headers[0]="Host:example.com";// 例:ヘッダーに Host を設定する必要があります。
// ヘッダーを設定します。
config.setCustomHeaders(headers);
....// その他の設定
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);ピクチャー・イン・ピクチャー (PiP)
詳細なコード例については、「API-Example」の ピクチャー・イン・ピクチャー再生 (PictureInPicture) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。
手順は次のとおりです。
AndroidManifest.xmlファイルで、ピクチャー・イン・ピクチャーの権限を宣言します。<activity android:name=".PictureInPictureActivity" android:exported="true" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" />ターゲット
Activityをピクチャー・イン・ピクチャーモードに切り替えます。Rational aspectRatio = new Rational(16, 9); // PiP ウィンドウの縦横比。ビジネスニーズに応じて調整できます。 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build());クリックイベント、アプリ離脱時、またはアプリ復帰時にピクチャー・イン・ピクチャーモードをトリガーするように選択できます。実装は次のとおりです。
クリックイベントでトリガー
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Rational aspectRatio = new Rational(16, 9); // PiP ウィンドウの縦横比。 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build()); } });アプリ離脱時にトリガー
@Override protected void onUserLeaveHint() { super.onUserLeaveHint(); Rational aspectRatio = new Rational(16, 9); // PiP ウィンドウの縦横比。 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build()); Log.e(TAG, "PiP onUserLeaveHint"); }アプリ復帰時にトリガー
@Override public void onBackPressed() { super.onBackPressed(); // 戻るボタン押下でトリガー。 enterPictureInPictureMode(); }PiP 表示/非表示の UI を処理します。
@Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig); if (isInPictureInPictureMode) { // PiP モードに入る際の処理。 // UI を非表示にします。 Log.e(TAG, "PiP モードに入ります"); } else { // PiP モードから出る際の処理。 // UI を表示します。 Log.e(TAG, "PiP モードから出ます"); } }
RTS ライブストリーミング劣化
詳細なコード例については、「API-Example」の RTS 超低遅延ライブストリーミング (RtsLiveStream) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。
詳細については、「RTS ライブストリーミング」をご参照ください。
左右の音声チャンネルの切り替え
ApsaraVideo Player SDK for Android は、setOutputAudioChannel メソッドを使用して出力音声チャンネルを設定します。入力ソースがデュアルチャンネルの場合、以下の方法を使用して左チャンネルまたは右チャンネルに切り替えることができます。入力ソースがシングルチャンネルの場合、この設定は無効です。
以下の出力音声チャンネル設定は、音声レンダリングおよび PCM データコールバックの両方に影響します。
/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT は左チャンネルに切り替えて再生します。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT は右チャンネルに切り替えて再生します。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE はチャンネルを切り替えず、入力ソースのチャンネルを維持して再生します。
*/
aliPlayer.setOutputAudioChannel();音声ストリームの解析
リスナーを設定して音声および動画ストリームデータを取得します。音声および動画は暗号化ストリームであってはならず、暗号化ストリームは解析できません。
動画の背景色の設定
ApsaraVideo Player SDK for Android は、プレーヤーレンダリングの背景色を設定することをサポートしています。API および使用方法は次のとおりです。
API 例
/**
* 動画の背景色を設定します。
*
* @param color ARGB
*
*/
/****
* 動画の背景色を設定します
* @param color ARGB
*/
abstract public void setVideoBackgroundColor(int color);使用方法
// パラメーターは 8 桁の 16 進数値です。8 桁はペアになっており、順に A (アルファ透明度)、R (赤)、G (緑)、B (青) を表します。
// 例:0x0000ff00 は緑を表します。
aliPlayer.setVideoBackgroundColor(0x0000ff00);vidAuth 用の特定の再生ドメイン名の設定
vidAuth 方法では、vid に対応するドメイン名などのフィールドを指定できます。サポートされているフィールドの詳細については、「GetPlayInfo リクエストパラメーター」をご参照ください。API および使用方法は次のとおりです。
API 例
/**
* 再生パラメーターを設定します。
*
* @param playConfig 再生パラメーター。
*/
public void setPlayConfig(VidPlayerConfigGen playConfig);使用方法
VidPlayerConfigGen インターフェイスの addPlayerConfig メソッドを使用して playDomain フィールドを追加します。
vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
// playDomain フィールドを追加します。追加可能なフィールドのリファレンスについては、
// https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo を参照してください。
configGen.addPlayerConfig("playDomain", "com.xxx.xxx");
vidAuth.setPlayConfig(configGen);H.266 デコーディングプラグイン
H.266 (VVC/Versatile Video Coding) は次世代の動画エンコーディング標準であり、同じ画質でビットレートを大幅に節約できます。パフォーマンスを最適化し、メイン SDK のサイズを制御するために、H.266 の付加価値デコーディング機能はプラグインとして個別にパッケージ化され、オンデマンドで統合できます。
前提条件
プレーヤーまたはオールインワン SDK が V7.6.0 以降であること。
Professional Edition のライセンスが認証されていること。詳細については、「ApsaraVideo Player SDK のライセンス取得」をご参照ください。
H.266 デコーディングプラグインを搭載した ApsaraVideo Player は、Alibaba Cloud トランスコード でトランスコードされた H.266 動画の再生のみをサポートします。
プラグインの統合
プラグインの有効化
ApsaraVideo Player SDK for Android V7.7.0 以降では、プラグインは統合後にデフォルトで有効になり、手動で有効化する必要はありません。
AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);関連エラーコード
H.266 デコーディングプラグインに関連するエラーコードについては、「各プラットフォームのプレーヤーに関するよくある質問」をご参照ください。
再生ソースの自動更新
再生ソースの自動更新機能を有効にすると、認証メカニズムによる有効期限切れによる再生中断を防げます。この機能は、ソースが無効になるとリスナーをトリガーし、新しいアドレスを取得して、動画再生を継続的かつスムーズに保ちます。
前提条件
プレーヤーまたはオールインワン SDK が V7.9.0 以降であること。
VidAuth ソースを使用した再生を行っているか、サービスでURL 署名が設定されていること。
VidAuth ソース
API 例
/**
* VidAuth ソースの有効期限切れイベントのリスナーを設定します。
*
* この機能により、VidAuth ソースの自動更新が可能になり、有効期限切れによる再生中断を回避できます。
* リスナーがトリガーされると、VidAuth ソースを更新し、{@link SourceRefreshCallback#onSuccess} を使用して
* 更新された VidAuth を返すことができます。
*
* @param listener VidAuth ソースの有効期限切れイベントをリッスンするインターフェイス。{@link OnVidAuthExpiredListener} を参照。
*
*/
abstract public void setOnVidAuthExpiredListener(OnVidAuthExpiredListener listener);機能コンポーネント
UrlSource ソース
API 例
/**
* URL ソースの有効期限切れイベントのリスナーを設定します。
*
* この機能により、認証による URL の有効期限切れによる再生中断を回避するために
* URL の更新が可能になります。リスナーがトリガーされると、URL ソースを更新し、
* {@link SourceRefreshCallback#onSuccess} を使用して更新された URL ソースを返すことができます。
*
* @param listener URL ソースの有効期限切れイベントを処理するリスナー。{@link OnURLSourceExpiredListener} を参照。
*
* <p>URL 認証の設定方法については、
* <a href="https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL 認証ドキュメント</a>をご参照ください。</p>
*/
abstract public void setOnURLSourceExpiredListener(OnURLSourceExpiredListener listener);機能コンポーネント
補足ユーティリティ関数
タイプ A 署名を例として使用します。
バインドされた NIC の切り替え
ApsaraVideo Player SDK for Android は、AliPlayerGlobalSettings.enableSwitchNIC メソッドを提供しており、ネットワーク異常時にネットワークインターフェースコントローラー (NIC) を自動的に切り替えて、リソース再生の安定性を確保できます。サンプルコード:
これは、スイッチが有効になっており、複数の NIC が存在する場合にのみ有効になります。
AliPlayerGlobalSettings.enableSwitchNIC(true);パフォーマンス
再生シーンの設定
再生シーンを設定すると、そのシーンに最適なパラメーター (バッファー設定、機能スイッチなど) が自動的に設定されます。setConfig インターフェイスを通じて行ったカスタムパラメーター設定とも互換性があります (カスタム設定が優先されます)。
再生シーンを設定した後、
getConfigインターフェイスを通じてパラメーター設定を確認できます。
API 例
/**
* プレーヤーシーンを設定します。
*
* @param scene.
*/
abstract public void setPlayerScene(PlayerScene scene);再生シーン
public enum PlayerScene {
/**
* シーンなし
*/
NONE,
/**
* 長尺シーン:30 分以上に適用
*/
LONG,
/**
* 中尺シーン:5 分~30 分に適用
*/
MEDIUM,
/**
* 短尺シーン:0 秒~5 分に適用
*/
SHORT,
/**
* ライブシーン
*/
LIVE,
/**
* RTS ライブシーン
*/
RTS_LIVE
}使用方法
// 短尺動画シーンを設定します。
aliPlayer.setPlayerScene(PlayerScene.SHORT)
// 中尺動画シーンを設定します。
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)
// 長尺動画シーンを設定します。
aliPlayer.setPlayerScene(PlayerScene.LONG)
// ライブシーンを設定します。
aliPlayer.setPlayerScene(PlayerScene.LIVE)プリレンダリング
ApsaraVideo Player SDK for Android は、再生開始前に最初のフレームを迅速にレンダリングすることをサポートしており、起動速度を向上させることができます。
この機能はデフォルトで無効になっています。
この機能を有効にすると、準備成功イベントと最初のフレームレンダリングイベントのトリガー順序に影響します。無効時に比べ、有効時にデコーディングおよびレンダリング速度の違いにより、最初のフレームレンダリングイベントが準備成功イベントの前にトリガーされる場合がありますが、再生には影響しません。
例:
aliPlayer.setOption(ALLOW_PRE_RENDER, 1);ローカルキャッシュ
詳細なコード例については、「API-Example」の 動画プリロード (Preload) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。
ApsaraVideo Player SDK for Android はローカルキャッシュ機能を提供しており、ユーザーが動画の再再生時に起動速度、シーク速度を向上させ、カクつきを減らし、トラフィックを節約できます。
ローカルキャッシュの有効化
ローカルキャッシュ機能はデフォルトで無効になっています。使用するには、手動で有効にする必要があります。AliPlayerGlobalSettings の enableLocalCache を通じて制御します。サンプルコード:
動画再生 URL に認証パラメーターが含まれている場合、ローカルキャッシュおよび再生中にこれらのパラメーターが変更されます。同じ URL で異なる認証を使用した場合のキャッシュヒット率を向上させるために、
setCacheUrlHashCallbackインターフェイスを使用して、ハッシュ値 (例:MD5) を計算する前に認証パラメーターを URL から削除できます。例:認証付きの再生 URL がhttp://****.mp4?aaaの場合、読み込み時にhttp://****.mp4を使用してハッシュ値を計算します。ただし、動画が暗号化された M3U8 動画の場合、キー URL の認証パラメーターを削除してハッシュ値を計算すると、異なる動画が同じキーをキャッシュにヒットさせ、再生に失敗する可能性があります。解決策:setCacheUrlHashCallbackコールバック内でドメインチェックを行い、再生ドメイン (http(s)://xxxxx.m3u8?aaaa) のみ認証パラメーターを削除し、キー URL のドメイン (http(s)://yyyyy?bbbb) では削除しないようにします。
サーバーが HTTP および HTTPS の両方をサポートしており、異なるプロトコルが同じメディアファイルを指している場合、ハッシュ値を計算する前にリクエストヘッダーを削除または統一できます。例:
動画再生 URL が
https://****.mp4およびhttp://****.mp4の場合、読み込み時に****.mp4を使用してハッシュ値を計算します。動画再生 URL が
https://****.mp4の場合、ハッシュ値を計算する前にhttp://****.mp4に統一します。
プレーヤー SDK バージョン 5.5.4.0 以降で、動画再生 URL に認証パラメーターが含まれており、再生プロトコルが HLS の場合、
PlayerConfig.mEnableStrictAuthModeフィールドを設定して、異なる認証モードを選択できます (古いバージョンのデフォルト値は false、V7.13.0 以降は true)。非厳密認証 (false):認証もキャッシュされます。前回の再生でメディアの一部のみがキャッシュされていた場合、プレーヤーはキャッシュされた認証を使用して、キャッシュされていない部分のリクエストを行います。URL 署名の有効期間が短い場合や、長時間停止後に再生を再開する場合、認証が有効期限切れとなり、再生ソースの自動更新 機能を統合して、有効期限切れの認証を処理し、再生を継続する必要があります。
厳密認証 (true):認証はキャッシュされません。各再生開始時に認証が実行されるため、ネットワーク接続がないと再生に失敗します。
単一 URL のローカルキャッシュの有効化または無効化
単一の URL に対してローカルキャッシュ機能を有効または無効にするには、player config で設定できます。
// まず、設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// 再生 URL のローカルキャッシュを有効にするかどうか。デフォルト値は true です。AliPlayerGlobalSettings でローカルキャッシュが有効になっており、ここでローカルキャッシュも有効に設定されている (true に設定されている) 場合、この URL のローカルキャッシュが有効になります。ここで false に設定されている場合、この URL のローカルキャッシュは無効になります。
config.mEnableLocalCache = false;
....// その他の設定
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);プリロード
ApsaraVideo Player SDK for Android はプリロード機能を提供しており、これはローカルキャッシュ機能のアップグレード版です。動画キャッシュのメモリサイズを設定することで、動画の起動速度をさらに向上させることができます。
プリロード機能の使用制限は次のとおりです。
現在、MP4、MP3、FLV、HLS などの単一メディアファイルの読み込みをサポートしています。
ApsaraVideo Player SDK for Android は、プリロード中にデフォルトで自動ネットワークリソーススケジューリング機能を提供しており、再生中の動画のネットワークリクエストへのプリロードネットワークリクエストの影響を軽減します。自動スケジューリング戦略は、再生中の動画のバッファーが一定のしきい値に達した場合にのみ、プリロードがリクエストを許可するというものです。リアルタイムのプリロードリクエストを自分で制御するには、以下の方法でこの戦略を無効にできます。
AliPlayerGlobalSettings.enableNetworkBalance(false);ローカルキャッシュ機能を有効にします。詳細については、「ローカルキャッシュ」をご参照ください。
データソースを設定します。
VidAuth (推奨)
VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid info");// 必須パラメーター、動画 ID (VideoId)。 vidAuth.setPlayAuth("<yourPlayAuth>");// 必須パラメーター、再生認証情報。ApsaraVideo VOD サービスの GetVideoPlayAuth API を呼び出して生成する必要があります。 vidAuth.setRegion("Access region");// プレーヤー SDK V5.5.5.0 以降では、このパラメーターは非推奨です。リージョンを設定する必要はなく、プレーヤーが自動的に解析します。プレーヤー SDK バージョン 5.5.5.0 以前では、このパラメーターは必須です。ApsaraVideo VOD サービスのアクセスリージョンで、デフォルトは cn-shanghai です。 vidAuth.setQuality("Selected definition") //"AUTO" はアダプティブビットレートを表します。VidSts
VidSts vidSts = new VidSts(); vidSts.setVid("Vid info");// 必須パラメーター、動画 ID (VideoId)。 vidSts.setAccessKeyId("<yourAccessKeyId>");// 必須パラメーター、一時的な STS トークンペアの AccessKey ID。STS サービスの AssumeRole API を呼び出して生成する必要があります。 vidSts.setAccessKeySecret("<yourAccessKeySecret>");// 必須パラメーター、一時的な STS トークンペアの AccessKey Secret。STS サービスの AssumeRole API を呼び出して生成する必要があります。 vidSts.setSecurityToken("<yourSecurityToken>");// 必須パラメーター、STS セキュリティトークン。STS サービスの AssumeRole API を呼び出して生成する必要があります。 vidSts.setRegion("Access region");// 必須パラメーター、ApsaraVideo VOD サービスのアクセスリージョンで、デフォルトは cn-shanghai です。 vidSts.setQuality("Selected definition") //"AUTO" はアダプティブビットレートを表します。UrlSource
UrlSource urlSource = new UrlSource(); urlSource.setUri("Playback address");// 必須パラメーター、再生アドレス。サードパーティの VOD アドレスまたは Alibaba Cloud ApsaraVideo VOD サービスの再生アドレスです。タスクパラメーターを設定します。
説明これはマルチビットレート動画にのみ適用されます。
setDefaultBandWidth、setDefaultResolution、またはsetDefaultQualityのいずれか 1 つを選択できます。PreloadConfig preloadConfig = new PreloadConfig(); // マルチビットレートストリームのプリロードビットレートを設定します。 preloadConfig.setDefaultBandWidth(400000); // マルチビットレートストリームのプリロード解像度を設定します。 preloadConfig.setDefaultResolution(640 * 480); // マルチビットレートストリームのプリロード画質を設定します。 preloadConfig.setDefaultQuality(“FD”); // プリロード期間を設定します。 preloadConfig.setDuration(1000);タスクリスナーを追加します。
タスクを構築し、
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)オプション: タスクを管理します。
mediaLoaderV2.cancelTask(taskId); // 指定されたタスク ID のプリロードタスクをキャンセルします。 mediaLoaderV2.pauseTask(taskId); // 指定されたタスク ID のプリロードタスクを一時停止します。 mediaLoaderV2.resumeTask(taskId); // 指定されたタスク ID のプリロードタスクを再開します。オプション: 読み込まれたファイルを削除します。
必要に応じて読み込まれたファイルを削除してスペースを節約できます。ApsaraVideo Player SDK for Android は削除インターフェイスを提供していません。アプリ内で読み込みディレクトリのファイルを削除する必要があります。
動的プリロード
動的プリロード戦略により、統合者は現在再生中の動画のキャッシュと、プリロードされた動画の数およびキャッシュを制御でき、再生体験とコストのバランスを取るビジネスニーズを満たします。
マルチビットレート HLS 動画のプリロード
listPlayer + マルチビットレート HLS 動画再生シナリオでは、統合者は現在の再生画質と一致するストリームをプリロードし、ビジネスニーズに基づいてプリロードモードを選択できます。
ダウンロード速度の取得
現在再生中の動画のダウンロード速度は、onInfo コールバックで getExtraValue API を使用して取得します。サンプルコード:
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
// 現在のダウンロード速度。
long extraValue = infoBean.getExtraValue();
}
}
});ネットワーク機能
HTTPDNS
HTTPDNS は DNS 解決技術を使用して、ドメイン名解決リクエストを特定の HTTPDNS サーバーに送信し、より高速で安定したドメイン名解決結果を取得することで、DNS ハイジャックのリスクを軽減します。
ApsaraVideo Player SDK は、Alibaba Cloud CDN ドメイン名向けに強化された HTTPDNS 機能を提供し、Alibaba Cloud CDN ネットワーク向けの精密なスケジューリングおよびリアルタイム解決をサポートし、ネットワークパフォーマンスを効果的に向上させます。
強化された HTTPDNS の使用例
強化された HTTPDNS は、Alibaba Cloud CDN ドメイン名に対してのみ HTTPDNS サービスを提供します。設定するドメイン名が Alibaba Cloud CDN ドメイン名であり、ドメイン名設定が完了していて正常に使用できることを確認してください。ApsaraVideo VOD で CDN ドメイン名を追加および設定する方法については、「高速化ドメイン名の追加」をご参照ください。CDN ドメイン名の詳細については、「Alibaba Cloud CDN」をご参照ください。
// 強化された HTTPDNS を有効にします。
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// オプションで、HTTPDNS 事前解決ドメイン名を追加します。
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");HTTP/2
ApsaraVideo Player SDK for Android は、バージョン 5.5.0.0 以降で HTTP/2 をデフォルトで有効にしています。
ApsaraVideo Player SDK for Android は HTTP/2 プロトコルをサポートしており、多重化を使用して head-of-line ブロッキングを回避し、再生パフォーマンスを向上させます。サンプルコード:
AliPlayerGlobalSettings.setUseHttp2(true);HTTP 事前接続 TCP
HTTP 動画再生リクエスト (HTTPS ではない) の場合、事前に TCP 接続を確立することで、ユーザーエクスペリエンスを大幅に向上させ、ネットワーク接続時間を短縮し、再生の即時性および継続性を保証し、ネットワークおよびシステムリソースの使用を最適化できます。使用方法は次のとおりです。
// ドメイン形式は host[:port] で、ポートはオプションです。複数のドメイン名はセミコロン (;) で区切ります。
// グローバル設定
// 完全なインターフェイスは、各設定で現在の文字列を使用します (増やす - 追加、減らす - 削除)。空の文字列は事前接続を停止します。
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");動画ダウンロード
詳細なコード例については、「API-Example」の 動画ダウンロードおよびオフライン再生 (Download) モジュールをご参照ください。この Java ベースの ApsaraVideo Player SDK for Android のサンプルプロジェクトは、SDK のコア機能を迅速に統合するのに役立ちます。
ApsaraVideo Player SDK for Android は、ApsaraVideo VOD 動画のダウンロード機能を提供しており、ユーザーが動画をローカルにキャッシュして ApsaraVideo Player で視聴できるようにします。通常ダウンロードとセキュアダウンロードの 2 種類のダウンロード方法があります。
通常ダウンロード
ダウンロードされた動画データは Alibaba Cloud によって暗号化されず、ユーザーはサードパーティのプレーヤーで再生できます。
セキュアダウンロード
ダウンロードされた動画データは Alibaba Cloud によって暗号化されます。サードパーティのプレーヤーでは再生できません。Alibaba Cloud のプレーヤーでのみ再生できます。
使用上の注意
動画ダウンロード機能は、VidSts および VidAuth 方法でのみサポートされています。
プレーヤーの動画ダウンロード機能を使用するには、ApsaraVideo VOD コンソールでダウンロードモードを有効にして設定する必要があります。詳細については、「オフラインダウンロード」をご参照ください。
動画ダウンロードは、再開可能なダウンロードをサポートしています。
操作手順
オプション: セキュアダウンロードの暗号化検証ファイルを設定します。これはセキュアダウンロードにのみ必要で、通常ダウンロードには不要です。
説明設定された暗号化検証ファイルがアプリ情報と一致していることを確認してください。一致していない場合、動画ダウンロードは失敗します。
ダウンロード方法をセキュアダウンロードに設定する場合、ApsaraVideo VOD コンソールで生成されたキーファイルをプレーヤー SDK に設定する必要があります。このファイルは、動画ダウンロードおよび再生時の復号および検証に使用されます。キーファイルの生成方法については、「セキュアダウンロードの有効化」をご参照ください。
Application で一度設定することを推奨します。サンプルコード:
PrivateService.initService(getApplicationContext(), "encryptedApp.dat が配置されているファイルパス"); // encryptedApp.dat 暗号化検証ファイルを端末に保存し、ここに暗号化検証ファイルのローカルファイルパスを設定することを推奨します。ダウンローダーを作成および設定します。
AliDownloaderFactory を使用してダウンローダーを作成します。サンプルコード:
AliMediaDownloader mAliDownloader = null; ...... // ダウンローダーを作成します。 mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); // ダウンロードの保存パスを設定します。 mAliDownloader.setSaveDir("保存フォルダのアドレス");リスナーイベントを設定します。
ダウンローダーは複数のイベントリスナーを提供します。サンプルコード:
ダウンロードソースを準備します。
prepareメソッドを使用してダウンロードソースを準備します。ダウンロードソースは VidSts および VidAuth 方法の両方をサポートしています。サンプルコード:VidSts
// VidSts インスタンスを作成します。 VidSts aliyunVidSts = new VidSts(); aliyunVidSts.setVid("video ID (VideoId)"); // 動画 ID (VideoId)。 aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // 一時的なセキュリティトークンサービス (STS) AccessKey ペアの AccessKey ID。STS の AssumeRole 操作を呼び出してこの値を生成する必要があります。 aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // 一時的なセキュリティトークンサービス (STS) AccessKey ペアの AccessKey Secret。STS の AssumeRole 操作を呼び出してこの値を生成する必要があります。 aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // セキュリティトークンサービス (STS) トークン。STS の AssumeRole 操作を呼び出してこの値を生成する必要があります。 aliyunVidSts.setRegion("video-on-demand サービスがデプロイされているリージョン"); // video-on-demand サービスがデプロイされているリージョン。デフォルト値:cn-shanghai。 // VOD コンソールで HLS 暗号化パラメーターパススルーを有効にしている場合、デフォルトのパラメーター名が MtsHlsUriToken であるため、VidPlayerConfigGen オブジェクトを設定し、それを vid パラメーターに渡す必要があります。以下の例を参照してください。 // VOD コンソールで HLS 暗号化パラメーターパススルーを有効にしていない場合、以下のコードを含める必要はありません。 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); aliyunVidSts.setPlayerConfig(vidConfig); // ダウンロードソースを準備します。 mAliDownloader.prepare(aliyunVidSts);VidAuth
// VidAuth を作成します。 VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid info");// 動画 ID。 vidAuth.setPlayAuth("<yourPlayAuth>");// 再生認証情報。ApsaraVideo VOD サービスの GetVideoPlayAuth API を呼び出して生成する必要があります。 vidAuth.setRegion("Access region");// プレーヤー SDK V5.5.5.0 以降では、このパラメーターは非推奨です。リージョンを設定する必要はなく、プレーヤーが自動的に解析します。プレーヤー SDK バージョン 5.5.5.0 以前では、このパラメーターは必須です。ApsaraVideo VOD サービスのアクセスリージョンで、デフォルトは cn-shanghai です。 // VOD コンソールで HLS 標準暗号化パラメーターパススルーを有効にしている場合、デフォルトのパラメーター名が MtsHlsUriToken であるため、config を設定し、それを vid に渡す必要があります。以下を参照してください。 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); vidAuth.setPlayerConfig(config); // ダウンロードソースを準備します。 mAliDownloader.prepare(vidAuth);
説明ソースファイルのフォーマットと出力ダウンロードファイルのフォーマットは同じでなければならず、変更できません。
VOD コンソールで HLS 標準暗号化パラメーターパススルーを有効にしている場合、デフォルトのパラメーター名は MtsHIsUriToken です。詳細については、「HLS 標準暗号化パラメーターパススルー」をご参照ください。その後、上記のコードに従って VOD ソースの MtsHIsUriToken 値を設定します。
準備が成功したら、ダウンロードアイテムを選択してダウンロードを開始します。
準備が成功すると、
OnPreparedListenerメソッドがコールバックされます。返された TrackInfo には、各動画ストリームの定義などの情報が含まれます。ダウンロードするトラックを選択します。サンプルコード:public void onPrepared(MediaInfo mediaInfo) { // ダウンロードアイテムの準備が成功しました。 List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); // 例:最初の TrackInfo をダウンロードします。 mAliDownloader.selectItem(trackInfos.get(0).getIndex()); // ダウンロードを開始します。 mAliDownloader.start(); }(オプション) ダウンロードソースを更新します。
VidSts および VidAuth の有効期限切れを防ぐために、ダウンロード開始前にダウンロードソース情報を更新することもできます。サンプルコード:
// ダウンロードソースを更新します。 mAliDownloader.updateSource(VidSts); // ダウンロードを開始します。 mAliDownloader.start();ダウンロードが成功または失敗した後、ダウンローダーを解放します。
ダウンロードが成功した後、
releaseをonCompletionまたはonErrorコールバックで呼び出して、ダウンローダーを解放します。サンプルコード:mAliDownloader.stop(); mAliDownloader.release();オプション: ダウンロードされたファイルを削除します。
ダウンロード中またはダウンロード後にダウンロードされたファイルを削除できます。サンプルコード:
// オブジェクトを通じてファイルを削除します。 mAliDownloader.deleteFile(); // スタティックメソッドを通じてファイルを削除します。成功した場合、0 を返します。 AliDownloaderFactory.deleteFile("削除するダウンロードフォルダのパス", "動画 ID", "動画フォーマット", "ダウンロードされた動画のインデックス");
次のステップ
ダウンロードされた動画は、ApsaraVideo Player を使用して再生できます。具体的な方法は次のとおりです。
ダウンロードが完了したら、動画ファイルの絶対パスを取得します。
String path = mAliDownloader.getFilePath();VOD UrlSource 方法を使用して再生の絶対パスを設定します。
UrlSource urlSource = new UrlSource(); urlSource.setUri("Playback address");// ダウンロードされた動画の絶対パスを設定します。 aliPlayer.setDataSource(urlSource);
暗号化動画再生
ApsaraVideo VOD は、HLS 暗号化、Alibaba Cloud 専用の暗号化、および DRM 暗号化をサポートしています。ライブストリーミングは DRM 暗号化のみをサポートしています。暗号化再生については、「暗号化動画再生」をご参照ください。
Native RTS 再生
ApsaraVideo Player SDK for Android は Native RTS SDK を統合して、ネイティブ低遅延ライブストリーミングを実装します。詳細については、「Android での RTS ストリームフェッチングの実装」をご参照ください。