プレイリスト再生、字幕、動画ダウンロード、暗号化再生といった Android プレーヤー SDK の高度な機能を利用できます。API リファレンス
Professional Edition ライセンスの検証
一部のプレーヤー機能では、Professional Edition ライセンスが必要です。サポートされている機能は、プレーヤー SDK 機能の詳細で確認してください。これらの機能を使用するには、プレーヤー SDK ライセンスの取得に記載されているとおりに認可を完了してください。
アプリの起動前、またはプレーヤー API を呼び出す前にリスナーを設定します:
import com.aliyun.private_service.PrivateService;
PrivateService.setOnPremiumLicenseVerifyCallback(new PrivateService.OnPremiumLicenseVerifyCallback() {
@Override
public void onPremiumLicenseVerifyCallback(PrivateService.PremiumBizType type, boolean isValid, String errorMsg) {
Log.d(TAG, "onPremiumLicenseVerifyCallback: " + type + " isValid: " + isValid + " errorMsg: " + errorMsg);
}
});
PremiumBizType は、プロフェッショナル機能の列挙型です。関連する機能を使用すると、プレーヤーはライセンスを検証し、このコールバックで結果を返します。isValid が false の場合、errorMsg に理由が含まれます。
再生
プレイリストの再生
Android プレーヤー SDK は、プリロード機能付きのプレイリスト再生により、ショート動画の起動速度を大幅に向上させます。
プレイリストの再生体験を向上させるには、ショートドラマ ソリューションを使用してください。詳細については、「ショートドラマ クライアント開発」をご参照ください。
透明度を含む動画の再生
機能の概要
ApsaraVideo Player SDK は、透過的なギフトアニメーション用の alpha チャンネルのレンダリングをサポートします。ライブストリーミングでは、これらのアニメーションはライブコンテンツを遮ることなく再生されます。
制限事項
統合 SDK バージョン 6.8.0 以降、またはプレーヤー SDK バージョン 6.9.0 以降は、透過レンダリングをサポートします。
メリット
透明度を含む MP4 動画は、APNG や IXD と比べて、アニメーション品質が高く、ファイルサイズが小さく、互換性が高く、開発効率が向上します。
-
アニメーション品質の向上:MP4 は、APNG や IXD よりも元の詳細と色を正確に保持します。
-
ファイルサイズの縮小:MP4 はより効率的に圧縮されるため、読み込み速度が向上し、帯域幅の消費が削減されます。
-
互換性の向上:MP4 は、あらゆるデバイスやブラウザーでサポートされています。
-
開発効率の向上:開発者は、複雑な解析とレンダリングのロジックを実装する必要がありません。
外部字幕
詳細なコード例については、 API-Example の 外部字幕のデモと切り替え (ExternalSubtitle) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、デベロッパーが SDK 統合のコア機能を短時間で習得するのに役立ちます。
Android プレーヤー SDK は、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 バージョン 7.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.0533f 倍です。 double originalFontSizePx = vttContentAttribute.fontSizePx; // フォントサイズを 2 倍にします。 vttContentAttribute.fontSizePx = originalFontSizePx * 2; // フォントカラーを赤に変更します。 vttContentAttribute.mPrimaryColour = Color.argb(255, 255, 0, 0); // 親クラスのメソッドを呼び出してスタイルを適用します。 super.applyTextSpans(spannableStringBuilder, vttContentAttribute, start, end); } -
SpannableStringBuilderを直接操作して WebVTT スタイルを変更します。重要この方法では、ネイティブ WebVTT スタイルが失われる可能性があります。
/** * テキストのスタイル適用ロジックをオーバーライドし、カスタムスタイルを実装します。 * このメソッドは親クラスが基本スタイルを解析した後に呼び出されるため、フォントサイズ、色、その他の属性の二次処理を行うことができます。 * * @param spannableStringBuilder スタイル付きテキストの構築に使用します。 * @param vttContentAttribute 現在のテキストセグメントのスタイル属性オブジェクト (フォント、色、サイズなどが含まれます)。 * @param start スタイル適用の開始位置 (含む)。 * @param end スタイル適用の終了位置 (含まない)。 */ @Override protected void applyTextSpans(SpannableStringBuilder spannableStringBuilder, VttContentAttribute vttContentAttribute, int start, int end) { // フォントカラーを設定します。 spannableStringBuilder.setSpan( new ForegroundColorSpan(Color.RED), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ); // 絶対サイズを設定します。 spannableStringBuilder.setSpan( new AbsoluteSizeSpan(20), // 単位:px。 start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ); // 相対サイズを設定します。 // spannableStringBuilder.setSpan( // new RelativeSizeSpan(2.0f), // TextView のデフォルトフォントサイズに対する倍率。 // start, end, // Spanned.SPAN_EXCLUSIVE_EXCLUSIVE // ); }
-
-
カスタムフォント (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を作成する必要があります。/** * カスタム TypefaceSpan クラス。 * MetricAffectingSpan を継承し、テキストの描画および計測時に Typeface を正しく適用します。 * 標準の TypefaceSpan では Typeface オブジェクトを直接使用できない問題を解決します。 */ private static class CustomTypefaceSpan extends MetricAffectingSpan { // 適用するカスタムフォント。 private final Typeface typeface; /** * コンストラクター。 * * @param typeface 適用する Typeface オブジェクト (null 不可)。 */ public CustomTypefaceSpan(Typeface typeface) { this.typeface = typeface; } /** * テキスト描画状態を更新します。 * 実際のテキスト描画中に呼び出され、ペイントのフォントを設定します。 * * @param tp テキスト描画に使用する TextPaint オブジェクト。 */ @Override public void updateDrawState(TextPaint tp) { tp.setTypeface(typeface); } /** * テキスト計測状態を更新します。 * テキストレイアウト計算 (例:幅、改行) 中に呼び出され、計測結果を実際の描画と一致させます。 * * @param p テキスト計測に使用する TextPaint オブジェクト。 */ @Override public void updateMeasureState(TextPaint p) { p.setTypeface(typeface); } }
-
-
プレーヤーに統合します。
-
字幕ビューを初期化します。
// subtitleView を初期化します。 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); } } });
-
音声のみの再生
ビデオ再生を無効にすると、音声のみの再生になります。prepare を呼び出す前に PlayerConfig を設定します。
PlayerConfig config = aliPlayer.getConfig();
config.mDisableVideo = true; // ビデオ再生を無効にします。
aliPlayer.setConfig(config);
ソフトウェア/ハードウェアデコーダーの切り替え
再生を開始する前にデコード方式を切り替えてください。再生中の切り替えは無効です。
Android プレーヤー SDK は、enableHardwareDecoder スイッチを使用して、H.264 および H.265 のハードウェアデコードをサポートしています。ハードウェアデコードはデフォルトで有効になっており、初期化に失敗した場合は自動的にソフトウェアデコードにフォールバックします。例:
// ハードウェアデコードを有効にします。デフォルトでは有効です。
aliPlayer.enableHardwareDecoder(true);
プレーヤーがハードウェアデコードからソフトウェアデコードに自動的に切り替わると、onInfo コールバックが呼び出されます。例:
mApsaraPlayerActivity.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if (infoBean.getCode() == InfoCode.SwitchToSoftwareVideoDecoder) {
// ソフトウェアデコードに切り替わりました。
}
}
});
H.265 アダプティブ再生
デバイスがクラウドベースの H.265 ハードウェアデコードブラックリストに登録されている場合や、H.265 ハードウェアデコードに失敗した場合、適応的デグレードが作動します。H.264 バックアップストリームが存在する場合、プレーヤーはそれを使用します。存在しない場合は、H.265 ソフトウェアデコードにデグレードします。
-
この機能は、クライアント・クラウド統合適応的デコード付加価値サービスを有効化した後にのみ有効になります。Yida フォームを送信してライセンスを申請する必要があります。
-
クライアント・クラウド統合適応的デコード付加価値サービスの内容は次のとおりです:1. クラウドベースのハードウェアデコード互換性データの動的配信、2. H.265 ストリームから H.264 ストリームへの適応的デグレード。
-
付加価値サービスを有効化していない場合でも、SDK にはハードウェアデコード失敗時にソフトウェアデコードへ自動的に切り替える機能があります。
バックアップストリームの設定例:
// アプリケーション層で、元の URL とバックアップ URL のキーと値のペアを格納する Map を保持します。切り替え時は、元の URL をキーに Map からバックアップ URL を検索します。
AliPlayerGlobalSettings.setAdaptiveDecoderGetBackupURLCallback(new AliPlayerGlobalSettings.OnGetBackupUrlCallback() {
@Override
public String getBackupUrlCallback(int oriBizScene, int oriCodecType, String original_url) {
String kurl = original_url;
if (!H265toH264Map.get(kurl).isEmpty()) {
return H265toH264Map.get(kurl);
} else {
return "";
}
}
});
ネットワークアダプティブ画質切り替え
-
HLS アダプティブビットレートのビデオストリームは、ApsaraVideo VOD のビデオパッケージングおよびトランスコードテンプレートグループを使用して生成できます。詳細な操作については、VOD のアダプティブビットレートの構成をご参照ください。
-
ApsaraVideo VOD のトランスコードで生成されたアダプティブストリームで Vid 再生を使用する場合は、アダプティブビデオストリームを取得して再生できるように、デフォルトの再生解像度リストを
DEFINITION_AUTOとして指定する必要があります。指定しない場合、プレーヤーはデフォルトロジックに従って低解像度のビデオストリームを選択します。デフォルトの解像度の再生順序については、複数の解像度をトランスコードした場合、プレーヤー SDK はデフォルトでどの解像度を再生しますか?をご参照ください。VidAuth 再生で解像度リストを指定する例:VidAuth vidAuth = new VidAuth(); List<Definition> list = new ArrayList<>(); list.add(Definition.DEFINITION_AUTO); vidAuth.setDefinition(list);
Android プレーヤー SDK は、アダプティブビットレートの HLS および DASH ビデオストリームをサポートします。 prepare が成功した後、 getMediaInfo を呼び出すことで、各ビットレートストリームの情報、つまり TrackInfo を取得できます。例:
List<TrackInfo> trackInfos = aliPlayer.getMediaInfo().getTrackInfos();
再生中は、プレーヤーの selectTrack メソッドを呼び出して、再生中のビットレートストリームを切り替えることができます。値が AUTO_SELECT_INDEX の場合、アダプティブビットレートスイッチングが有効になります。例:
int index = trackInfo.getIndex();
// ビットレートを切り替えます。
aliPlayer.selectTrack(index);
// ビットレートを切り替えて、アダプティブスイッチングを有効にします。
aliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX);
切り替え結果は、 OnTrackChangedListener コールバック ( selectTrack を呼び出す前に設定) を介して通知されます。例:
aliPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() {
@Override
public void onChangedSuccess(TrackInfo trackInfo) {
// 切り替えに成功しました。
}
@Override
public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) {
// 切り替えに失敗しました。errorInfo.getMsg() から失敗の理由を取得します。
}
});
オプション: プレーヤーの selectTrack メソッドを呼び出してアダプティブビットレートに切り替える前に、想定外のビットレートへの自動切り替えを防ぐため、config でアダプティブビットレート (ABR) 切り替えの上限を設定できます。例: (設定を反映させるには、プレーヤーが prepare メソッドを呼び出す前、またはプレイリストプレーヤーが moveTo メソッドを呼び出す前に、次のコードを呼び出すことを推奨します。)
PlayerConfig config = aliPlayer.getConfig();
config.mMaxAllowedAbrVideoPixelNumber = 921600; // ABR 解像度のピクセル数の上限を 921600 (幅 × 高さ = 1280 × 720) に設定します。これにより、ABR での切り替えは、ピクセル数がこの値以下の解像度に限定されます。
aliPlayer.setConfig(config);
スクリーンショット
Android プレーヤー SDK は、snapshot インターフェイスにより、再生中のビデオのスクリーンショット機能を提供します。このインターフェイスは元のデータをキャプチャし、bitmap として返します。コールバックインターフェイスは OnSnapShotListener です。例:
// スクリーンショットのコールバックを設定します。
aliPlayer.setOnSnapShotListener(new OnSnapShotListener(){
@Override
public void onSnapShot(Bitmap bm, int width, int height){
// ビットマップと画像のサイズを取得します。
}
});
// 現在再生中のフレームをキャプチャします。
aliPlayer.snapshot();
プレビュー再生
ApsaraVideo VOD を構成すると、Android プレーヤー SDK でプレビュー再生を実装できます。VidSts と VidAuth の両方の再生方式に対応しています (ApsaraVideo VOD では VidAuth を推奨します)。構成および使用方法については、「動画のプレビュー」をご参照ください。
プレビュー再生を構成した後、VidPlayerConfigGen.setPreviewTime() メソッドを使用して、プレーヤーのプレビュー時間を設定します。VidSts 再生の例:
VidSts vidSts = new VidSts;
....
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
configGen.setPreviewTime(20);// 20 秒のプレビュー
vidSts.setPlayConfig(configGen);// 再生ソースに設定
...
プレビュー時間を設定すると、Android プレーヤー SDK を使用して再生する際、サーバーは動画全体ではなく、プレビュー期間内のコンテンツのみを返します。
-
VidPlayerConfigGen はサーバーのリクエストパラメーターに対応しています。詳細については、「リクエストパラメーターの説明」をご参照ください。
-
FLV 形式の動画、および MP3 形式の音声では、プレビュー再生はできません。
ブラックリストの設定
Android プレーヤー SDK は、ハードウェアデコードのブラックリストメカニズムを提供します。ハードウェアデコードを明示的に使用できないデバイスでは、ソフトウェアデコードを直接使用して、無効な操作を回避します。例:
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.model="Lenovo K320t";
AliPlayerFactory.addBlackDevice(BlackType.HW_Decode_H264 ,deviceInfo );
ブラックリストは、アプリの終了後に自動的に無効になります。
Referer の設定
PlayerConfig の mReferrer プロパティを使用してリクエストの Referer を設定します。コンソールの Referer ブロックリスト/許可リストと組み合わせることで、アクセス権限を制御します。例:
// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// mReferrer プロパティを設定します。例:http://example.aliyundoc.com。(注:プロトコルを含めてください。)
config.mReferrer = referrer;
....// その他の設定。
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);
ユーザーエージェントの設定
PlayerConfig でリクエストのユーザーエージェントを設定します。これにより、プレーヤーからのリクエストに UA が付加されます。例:
// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// UA を設定します。
config.mUserAgent = "UserAgent to set";
....// その他の設定。
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);
ネットワークの再試行時間と回数の設定
PlayerConfig を使用して、ネットワークタイムアウトとリトライ回数を設定します。例:
// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ネットワークのタイムアウト時間をミリ秒単位で設定します。
config.mNetworkTimeout = 5000;
// タイムアウトのリトライ回数を設定します。リトライの間隔は mNetworkTimeout です。mNetworkRetryCount = 0 はリトライしないことを意味し、リトライポリシーはアプリが決定します。デフォルト値は 2 です。
config.mNetworkRetryCount=2;
....// その他の設定
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);
-
NetworkRetryCount が設定されており、ネットワークの問題により読み込み状態になった場合、プレーヤーは mNetworkTimeout の間隔で NetworkRetryCount 回リトライします。
-
複数回のリトライ後も読み込み状態が続く場合、
onErrorイベントがトリガーされ、ErrorInfo.getCode() は ErrorCode.ERROR_LOADING_TIMEOUT となります。 -
NetworkRetryCount が 0 に設定されている場合、ネットワーク接続がタイムアウトすると、プレーヤーは、InfoBean.getCode() の値が InfoCode.NetworkRetry となる
onInfoイベントをトリガーします。この時点で、プレーヤーのreloadメソッドを呼び出してネットワークを再読み込みするか、他の方法で処理できます。
キャッシュとレイテンシー制御の設定
Android プレーヤー SDK は、PlayerConfig を通じてキャッシュとレイテンシーを制御するインターフェースを提供します。例:
HTTP ヘッダーの設定
PlayerConfig を使用すると、プレーヤー内のリクエストに HTTP ヘッダーのパラメーターを追加できます。例:
// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// ヘッダーを定義します。
String[] headers = new String[1];
headers[0]="Host:example.com"; // 例:ヘッダーに Host を設定します。
// ヘッダーを設定します。
config.setCustomHeaders(headers);
.... // その他の設定。
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);
ピクチャー イン ピクチャー
詳細なコード例については、API-Example の ピクチャー イン ピクチャー再生 (PictureInPicture) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、デベロッパーが SDK 統合のコア機能を短時間で習得できるようにします。
手順:
-
AndroidManifest.xmlファイルで、ピクチャー イン ピクチャーの権限を宣言します。<activity android:name=".PictureInPictureActivity" android:exported="true" android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" /> -
対象の
アクティビティをピクチャー イン ピクチャー モードに切り替えます。Rational aspectRatio = new Rational(16, 9); // ピクチャー イン ピクチャーのアスペクト比。ビジネス要件に基づいて調整してください。 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build());ピクチャー イン ピクチャー モードは、OnClick (クリックイベント)、アプリを離れるとき、または戻るボタンを押したときにトリガーできます。実装方法:
OnClick (クリックイベント) のトリガー
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Rational aspectRatio = new Rational(16, 9); // ピクチャー イン ピクチャーのアスペクト比。 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build()); } });アプリを離れるときのトリガー
@Override protected void onUserLeaveHint() { super.onUserLeaveHint(); Rational aspectRatio = new Rational(16, 9); // ピクチャー イン ピクチャーのアスペクト比。 PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder(); pipBuilder.setAspectRatio(aspectRatio); enterPictureInPictureMode(pipBuilder.build()); Log.e(TAG, "Picture-in-Picture onUserLeaveHint"); }戻るボタン押下時のトリガー
@Override public void onBackPressed() { super.onBackPressed(); // 戻るボタンの押下でトリガーします。 enterPictureInPictureMode(); } -
ピクチャー イン ピクチャーの表示/非表示に応じて UI を処理します。
@Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig); if (isInPictureInPictureMode) { // ピクチャー イン ピクチャー モードへの移行を処理します。 // UI を非表示にします。 Log.e(TAG, "Entered Picture-in-Picture mode"); } else { // ピクチャー イン ピクチャー モードの終了を処理します。 // UI を表示します。 Log.e(TAG, "Exited Picture-in-Picture mode"); } }
RTS 超低遅延ライブ再生
詳細なコード例については、API-Example の RTS 超低遅延ライブ再生 (RtsLiveStream) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトにより、デベロッパーはコア SDK の統合機能を迅速に習得できます。
左右音声チャンネルの入れ替え
Android プレーヤー SDK は、出力オーディオチャンネルを設定するための setOutputAudioChannel メソッドを提供します。入力ソースがステレオの場合、このメソッドを使用して左または右チャンネルに切り替えることができます。入力ソースがモノラルの場合、設定しても効果はありません。
出力オーディオチャンネルの設定は、オーディオレンダリングと PCM データコールバックの両方に影響します。
/*
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT は左チャンネル再生に切り替えます。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_RIGHT は右チャンネル再生に切り替えます。
OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_NONE はチャンネルを切り替えず、入力ソースのチャンネルを維持します。
*/
aliPlayer.setOutputAudioChannel(OutputAudioChannel.OUTPUT_AUDIO_CHANNEL_LEFT);
オーディオストリームの解析
リスナーを設定して、オーディオストリームとビデオストリームのデータを取得します。暗号化されたストリームは解析できないため、ストリームは暗号化されていない必要があります。
ビデオ背景色の設定
Android プレーヤー SDK では、プレーヤーのレンダリング背景色を設定できます。インターフェイスと使用方法は次のとおりです。
インターフェイス例
/**
* ビデオの背景色を設定します。
*
* @param color ARGB
*/
abstract public void setVideoBackgroundColor(int color);
使用方法
// パラメーターは 8 桁の 16 進数値です。各 2 桁は、順番に A (アルファ透明度)、R (赤)、G (緑)、B (青) を表します。
// 例えば、0xff00ff00 は緑色を表します。
aliPlayer.setVideoBackgroundColor(0xff00ff00);
vidAuth:指定再生ドメインの設定
vidAuth を使用すると、vid のドメインなどのフィールドを指定できます。サポートされているフィールドについては、「GetPlayInfo リクエストパラメーター」をご参照ください。インターフェイスと使用方法:
インターフェイスの例
/**
* 再生パラメーターを設定します。
*
* @param playConfig 再生パラメーター。
*/
public void setPlayConfig(VidPlayerConfigGen playConfig);
使用方法
VidPlayerConfigGen の addPlayerConfig メソッドを使用して、playDomain フィールドを追加します。
vidAuth = new VidAuth();
VidPlayerConfigGen configGen = new VidPlayerConfigGen();
// playDomain フィールドを追加します。追加できるその他のフィールドについては、以下をご参照ください。
// https://www.alibabacloud.com/help/vod/developer-reference/api-vod-2017-03-21-getplayinfo
configGen.addPlayerConfig("playDomain", "com.xxx.xxx");
vidAuth.setPlayConfig(configGen);
H.266 デコーディングプラグイン
H.266 (VVC/Versatile Video Coding) は、同等の画質でビットレートを大幅に削減する次世代ビデオコーディング規格です。H.266 デコーディング機能は、オンデマンドで統合できるよう、プラグインとして独立してパッケージ化されています。
前提条件
-
プレーヤー SDK/統合 SDK のバージョンが V7.6.0 以降であること。
-
Professional Edition のライセンス認証が完了していること。プレーヤー SDK ライセンスの取得
-
H.266 デコーディングプラグインを搭載した ApsaraVideo Player は、ApsaraVideo VOD のオーディオとビデオのトランスコーディングによってトランスコードされた H.266 ビデオのみをサポートします。
プラグインの統合
プラグインの有効化
Android プレーヤー SDK 7.7.0 以降、プラグインは統合後にデフォルトで有効になり、手動での有効化は不要です。
AliPlayerGlobalSettings.enableCodecPlugin("vvc", true);
関連エラーコード
H.266 デコーディングプラグインのエラーコードについては、「全プラットフォーム共通のプレーヤーの問題」をご参照ください。
再生ソースの自動更新
再生ソースの自動更新を有効にすると、認証メカニズムによるソースの有効期限切れが原因で発生する再生の中断を防ぐことができます。
前提条件
-
プレーヤー/統合 SDK バージョン V7.9.0 以降。
-
再生向け VidAuth ソース を使用していること、またはサービス側で URL 署名 を構成していること。
VidAuth ソース
インターフェイスの例
/**
* VidAuth ソースの有効期限切れイベントのリスナーを設定します。
*
* この機能により、期限切れによる再生の中断を回避するために VidAuth ソースを自動更新できます。
* リスナーがトリガーされると、このコールバック内で VidAuth ソースを更新し、
* {@link SourceRefreshCallback#onSuccess} を使用して更新済みの VidAuth を返すことができます。
*
* @param listener VidAuth ソースの有効期限切れイベントをリッスンするインターフェイス。{@link OnVidAuthExpiredListener} を参照してください。
*/
abstract public void setOnVidAuthExpiredListener(OnVidAuthExpiredListener listener);
機能コンポーネント
UrlSource
インターフェイスの例
/**
* URL ソースの有効期限切れイベントのリスナーを設定します。
*
* この機能により、認証によるURLの有効期限切れが原因の再生中断を避けるため、URLを更新できます。
* リスナーがトリガーされると、このコールバック内で URL ソースを更新し、
* {@link SourceRefreshCallback#onSuccess} を使用して更新済みの URL ソースを返すことができます。
*
* @param listener URL ソースの有効期限切れイベントを処理するためのリスナー。{@link OnURLSourceExpiredListener} を参照してください。
*
* <p>URL 認証の設定の詳細については、
* <a href="https://www.alibabacloud.com/help/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW">URL 認証ドキュメント</a>をご参照ください。</p>
*/
abstract public void setOnURLSourceExpiredListener(OnURLSourceExpiredListener listener);
機能コンポーネント
補足ユーティリティ関数
認証タイプ A を例とします。
バインドされた NIC の切り替え
Android プレーヤー SDK は、ネットワークの異常時に NIC を自動的に切り替え、リソースの安定した再生を確保する AliPlayerGlobalSettings.enableSwitchNIC メソッドを提供します。例:
これは、切り替え機能が有効で、かつ複数の NIC が存在する場合にのみ有効になります。
AliPlayerGlobalSettings.enableSwitchNIC(true);
オーディオエンハンスメント
Android プレーヤー SDK は、音声再生体験を向上させるためのオーディオエンハンスメントプラグインを提供しており、音量正規化、音声強調、サラウンドサウンドが特徴です。
機能紹介
-
音量正規化:すべてのオーディオコンテンツを一定の音量レベルに自動調整し、元の音量が極端に低いまたは高い動画の再生体験を大幅に向上させます。
-
対応チャンネル:モノラル / ステレオ / 5.1 / 7.1。
-
対応サンプルレート:16 kHz / 44.1 kHz / 48 kHz。
-
-
音声強調:元の音色を維持しながら対話をインテリジェントに強調し、騒がしいシーンでも音声をよりクリアで明るくします。
-
対応チャンネル:ステレオ。
-
対応サンプルレート:44.1 kHz / 48 kHz。
-
-
サラウンドサウンド:マルチチャンネルおよびステレオ動画に仮想サラウンドレンダリングを適用し、ヘッドフォンや標準的なデバイスで没入感のある体験を提供します。3DSurround (ステレオサラウンド) と MegaBass (スーパーベース) モードを備えています。
-
対応チャンネル:モノラル / ステレオ / 5.1 / 7.1。
-
対応サンプルレート:44.1 kHz / 48 kHz。
-
前提条件
-
プレーヤー/統合 SDK のバージョンが V7.13.0 以降であること。
-
Professional Edition License の権限が付与されていること。プレーヤー SDK ライセンスの取得
オーディオエンハンスメントが対応するオーディオソース:
-
VOD ストリーム: ApsaraVideo VOD の音声と動画のトランスコーディングを使用する必要があります。
-
ライブストリーム:任意のソースに対応します。
プラグインの統合
Maven 統合 (推奨)
アプリの build.gradle ファイルに、指定されたプラグインバージョンの依存関係を追加します。
最新の Android プレーヤー SDK バージョンについては、「Android SDK リリース履歴」をご参照ください。
// x.x.x はプレーヤー SDK のバージョン番号と一致します。
implementation 'com.aliyun.sdk.android:AlivcAudioEnhanceFilter:x.x.x'
ローカル統合
最新の Android プレーヤー SDK をダウンロードし、AlivcAudioEnhanceFilter パッケージをプロジェクトの libs ディレクトリ (存在しない場合は手動で作成) にコピーします。詳細については、「ローカル統合」をご参照ください。
機能インターフェイス
setFilterValid
オーディオエンハンスメントのマスタースイッチを制御します。オーディオエンハンスメントフィルターの target 名は audioEnhance です。無効にすると、3 つのサブ機能はすべて無効になります (デフォルトでは無効)。
player.setFilterValid("audioEnhance", true); // 有効化。
player.setFilterValid("audioEnhance", false); // 無効化。
setFilterConfig
FilterConfig を prepare の前に設定します。再生開始後に有効になります。
FilterConfig filterConfig = new FilterConfig();
FilterConfig.Filter filterItem = new FilterConfig.Filter("audioEnhance");
FilterConfig.FilterOptions opts = new FilterConfig.FilterOptions();
// サラウンドサウンド。
opts.setOption("enable_surround", true);
opts.setOption("surround_effect_type", "3DSurround"); // 初回使用時は、タイプを enable_surround と一緒に設定する必要があります。
// 音声強調。
opts.setOption("enable_dialoguenhance", true);
opts.setOption("dialoguenhance_voice", 1.0f); // 1.0 ~ 10.0。初回使用時は、音声強調の強度を enable_dialoguenhance と一緒に設定する必要があります。
// 音量正規化。
opts.setOption("enable_normalizer", true);
filterItem.setOptions(opts);
filterConfig.addFilter(filterItem);
player.setFilterConfig(filterConfig);
|
パラメーター |
タイプ |
説明 |
|
|
Boolean |
サラウンドサウンド機能スイッチ。 |
|
|
String |
サラウンドサウンドタイプ: |
|
|
Boolean |
音声強調機能スイッチ。 |
|
|
Float |
音声強調の強度、範囲 1.0 ~ 10.0。 |
|
|
Boolean |
音量正規化機能スイッチ。 |
updateFilterConfig
プレーヤーの準備中または準備後に、パラメーターを動的に調整するには、このインターフェイスを呼び出します。
updateFilterConfig を prepare の前に呼び出しても効果はありません。初期設定には setFilterConfig を使用してください。
FilterConfig.FilterOptions opts = new FilterConfig.FilterOptions();
opts.setOption("enable_surround", true);
opts.setOption("surround_effect_type", "3DSurround"); // 初回有効時でない場合、初期化が完了しているためこのタイプ設定は無効です。
player.updateFilterConfig("audioEnhance", opts);
サラウンドサウンドタイプ ("3DSurround" / "MegaBass") と音声強調の強度 (dialoguenhance_voice) は、初回使用時に enable 属性と一緒に設定する必要があります。そうしない場合、初期化にはデフォルト値が使用され (サラウンドサウンドのデフォルトは "3DSurround"、音声強調の強度のデフォルトは 1.0)、再生中には変更できません。
パフォーマンス
再生シナリオの設定
再生シナリオを設定すると、最適なパラメーター (バッファー設定や機能スイッチを含む) が自動的に設定されます。setConfig インターフェイスによるカスタムパラメーター設定と互換性があります (カスタム設定が優先されます)。
-
再生シナリオを設定した後、
getConfigインターフェイスを使用してパラメーター設定を表示できます。
インターフェイスの例
/**
* プレーヤーシナリオを設定します。
*
* @param scene
*/
abstract public void setPlayerScene(PlayerScene scene);
再生シナリオ
public enum PlayerScene {
/**
* シナリオ:なし。
*/
NONE,
/**
* 長編動画シナリオ:30 分を超える動画に適用されます。
*/
LONG,
/**
* 中編動画シナリオ:5 分~30 分の動画に適用されます。
*/
MEDIUM,
/**
* 短編動画シナリオ:5 分以内の動画に適用されます。
*/
SHORT,
/**
* ライブシナリオ。
*/
LIVE,
/**
* 超低遅延ライブシナリオ。
*/
RTS_LIVE
}
使用方法
// 短編動画シナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.SHORT)
// 中編動画シナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.MEDIUM)
// 長編動画シナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.LONG)
// ライブシナリオを設定します。
aliPlayer.setPlayerScene(PlayerScene.LIVE)
プリレンダリング
Android プレーヤー SDK は、再生開始前に最初のフレームを高速でレンダリングする機能をサポートしており、起動速度を向上させることができます。
-
この機能はデフォルトで無効になっています。
-
フレームが準備でき次第
Viewにレンダリングされるように、Prepareを呼び出す前にViewを設定する必要があります。 -
この機能を有効にすると、準備完了イベントと最初のフレームのレンダリングイベントのトリガー順序に影響します。この機能がない場合、準備完了は最初のフレームのレンダリングより前にトリガーされます。この機能がある場合、デコードとレンダリングの速度の違いにより、最初のフレームのレンダリングが準備完了より前にトリガーされる可能性がありますが、これは再生に影響しません。
例:
aliPlayer.setOption(ALLOW_PRE_RENDER, 1);
ローカルキャッシュ
詳細なコード例については、API-Example の動画のプリロード (Preload) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、開発者がコア SDK の統合機能を迅速に習得するのに役立ちます。
ローカルキャッシュは、起動速度、シーク速度を向上させ、繰り返し再生時のカクつきを減らしながら、帯域幅を節約します。
ローカルキャッシュの有効化
ローカルキャッシュはデフォルトで無効になっています。使用するには、AliPlayerGlobalSettings と enableLocalCache を使用して手動で有効にする必要があります。例:
-
動画の再生 URL に認証パラメーターが含まれている場合、キャッシングと再生でパラメーターが変更されることがあります。認証情報が異なる場合でも同じ URL のキャッシュヒット率を向上させるには、
setCacheUrlHashCallbackを使用して、ハッシュ値 (例:MD5) を計算する前に認証パラメーターを削除してください。例えば、http://****.mp4?aaaのような URL の場合、http://****.mp4を使用してハッシュを計算します。ただし、暗号化された m3u8 動画の場合、ハッシュ化する前に keyURL から認証パラメーターを削除すると、異なる動画が同じキーにヒットしてしまい、再生に失敗する可能性があります。解決策として、setCacheUrlHashCallbackコールバックでドメインをチェックし、再生ドメイン (http(s)://xxxxx.m3u8?aaaa) の認証パラメーターのみを削除し、keyURL ドメイン (http(s)://yyyyy?bbbb) は削除しないでください。curl を使用して HLS 暗号化動画の M3U8 プレイリストを取得します。ここで、playURL は M3U8 アドレス、keyURL は AES-128 復号キーのアドレスです。ターミナル出力の例:# playURL: M3U8 プレイリストリクエスト C:\Users\futan>curl "https://videxxxv.cc/a003xxx2a-hd-encrypt-stream.m3u8?MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a&auth_key=17xxxrmonwFHJ" #EXTM3U #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 # keyURL: AES-128 暗号化キーアドレス #EXT-X-KEY:METHOD=AES-128,URI="https://apxxx.cc/decrypt?Ciphertext=NWNiNDQyN2MtNjV1ZS00ZWIwLTk0YTAtNTJhOWIyZWV1OTY2MzdoRTJ6TjVxcXkweFY2xxxNCt4OGNFRGNReHRG&MtsHlsUriToken=uheAz07oi-jlo9CeIU6LxxxAr4a3WtzrJXnCn4ClS44dTYHCQGmXBlo7TyuPLE0a" #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00001.ts?auth_key=1706560316-65b7xxx39f1d6c77 #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00002.ts?auth_key=1706560316-65b7xxxe8eca2faf #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00003.ts?auth_key=1706560316-65b7xxx50c6981b3 #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00004.ts?auth_key=1706560316-65b7xxxf7228c594 #EXTINF:10.000000, e9012989ecd8e987eb7349d84d3b06d8-hd-encrypt-stream-00005.ts?auth_key=1706560316-65b7xxx6dc68c35d -
サーバーが同じメディアファイルを指す HTTP と HTTPS の両方のプロトコルをサポートしている場合、ハッシュを計算する前にプロトコルを削除または標準化してください。例:
-
URL
https://****.mp4とhttp://****.mp4の場合、****.mp4を使用してハッシュを計算します。 -
URL
https://****.mp4の場合、ハッシュを計算する前にhttp://****.mp4に標準化します。
-
-
プレーヤー SDK バージョン 5.5.4.0 以降で、動画再生 URL に認証パラメーターが含まれ、HLS プロトコルを使用している場合、
PlayerConfig.mEnableStrictAuthModeを設定して認証モードを選択できます (古いバージョンではデフォルトは false、バージョン 7.13.0 以降では true)。-
非厳密認証 (false):認証はキャッシュされます。以前にメディアの一部のみがキャッシュされた場合、プレーヤーは後続のリクエストにキャッシュされた認証を使用します。URL 認証の有効期間が短い場合や、長時間の休止後に再生を再開した場合、認証が期限切れになる可能性があります。再生ソースの自動更新と統合して、認証の有効期限切れを処理してください。
-
厳密認証 (true):認証はキャッシュされません。認証は起動ごとに発生し、ネットワークがないと起動に失敗します。
-
単一URLのローカルキャッシュの有効化または無効化
特定の URL のローカルキャッシュを有効または無効にするには、PlayerConfig で設定します。
// まず設定を取得します。
PlayerConfig config = aliPlayer.getConfig();
// 再生URLのローカルキャッシュを有効にするかどうか。デフォルトは true です。グローバルなローカルキャッシュが有効な状態でこの値を true に設定すると、このURLに対してローカルキャッシュが有効になります。false に設定すると、このURLのローカルキャッシュは無効になります。
config.mEnableLocalCache = false;
....// その他の設定。
// プレーヤーに設定を適用します。
aliPlayer.setConfig(config);
プリロード
プリロードは、動画キャッシングのメモリ使用量を設定することで動画の起動速度を向上させる、ローカルキャッシュのアップグレード版です。
プリロードの制限:
-
現在、MP4、MP3、FLV、HLS などの単一メディアファイルのプリロードをサポートしています。
Android プレーヤー SDK は、プリロード中のネットワークリクエストが進行中の動画再生に与える影響を軽減するため、デフォルトでネットワークリソースの自動スケジューリングを提供します。この自動スケジューリング戦略では、現在再生中の動画のバッファーが特定のしきい値に達した後にのみプリロードリクエストが許可されます。リアルタイムのプリロードリクエストを自分で制御するには、次のメソッドを使用してこの戦略を無効にしてください。
AliPlayerGlobalSettings.enableNetworkBalance(false);
-
ローカルキャッシュを有効にします。詳細な手順については、「ローカルキャッシュ」をご参照ください。
-
データソースを設定します。
VidAuth (推奨)
VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid info"); // 必須パラメーター: 動画ID。 vidAuth.setPlayAuth("<yourPlayAuth>"); // 必須パラメーター: 再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth API を呼び出して生成されます。 vidAuth.setRegion("Access region"); // プレーヤー SDK バージョン 5.5.5.0 以降、このパラメーターは非推奨であり、必須ではありません。プレーヤーが自動的にリージョンを解析します。5.5.5.0 より前のバージョンでは、このパラメーターは必須です。デフォルトの ApsaraVideo VOD アクセスリージョンは cn-shanghai です。 vidAuth.setQuality("Selected definition"); // "AUTO" はアダプティブビットレートを表します。VidSts
VidSts vidSts = new VidSts(); vidSts.setVid("Vid info"); // 必須パラメーター: 動画ID。 vidSts.setAccessKeyId("<yourAccessKeyId>"); // 必須パラメーター: STS 一時 AK ペアのアクセスキー ID。STS の AssumeRole API を呼び出して生成されます。 vidSts.setAccessKeySecret("<yourAccessKeySecret>"); // 必須パラメーター: STS 一時 AK ペアのアクセスキー。STS の AssumeRole API を呼び出して生成されます。 vidSts.setSecurityToken("<yourSecurityToken>"); // 必須パラメーター: STS セキュリティトークン。STS の AssumeRole API を呼び出して生成されます。 vidSts.setRegion("Access region"); // 必須パラメーター: ApsaraVideo VOD アクセスリージョン。デフォルトは cn-shanghai です。 vidSts.setQuality("Selected definition"); // "AUTO" はアダプティブビットレートを表します。UrlSource
UrlSource urlSource = new UrlSource(); urlSource.setUri("Playback address"); // 必須パラメーター: 再生アドレス。サードパーティの VOD アドレスまたは Alibaba Cloud ApsaraVideo VOD の再生アドレスが使用できます。 -
タスクパラメーターを設定します。
説明マルチビットレート動画にのみ適用されます。
setDefaultBandWidth、setDefaultResolution、またはsetDefaultQualityのいずれかを選択してください。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のプリロードタスクを再開します。 -
(オプション):プリロードされたファイルを削除します。
容量を節約するために、必要に応じてプリロードされたファイルを削除します。Android プレーヤー SDK は削除インターフェイスを提供していないため、アプリ内のプリロードディレクトリからファイルを削除してください。
動的プリロード
動的プリロード戦略により、開発者は現在再生中の動画のキャッシュと、プリロードされたアイテムの数およびキャッシュの両方を制御でき、再生体験とコストオーバーヘッドのバランスを取ることができます。
マルチビットレートHLS動画のプリロード
listPlayer とマルチビットレート HLS 動画の再生シナリオでは、開発者は現在の再生画質に一致するストリームをプリロードし、ビジネスニーズに基づいてプリロードモードを選択できます。
ダウンロード速度の取得
onInfo コールバックを通じて現在の動画ダウンロード速度を取得します。これはgetExtraValue インターフェイスを使用して実装します。例:
aliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentDownloadSpeed){
// 現在のダウンロード速度。
long extraValue = infoBean.getExtraValue();
}
}
});
ネットワーク機能
HTTPDNS
HTTPDNS は、HTTP 経由でドメイン名を特定のサーバーに名前解決し、DNS ハイジャックのリスクを低減するとともに、より高速で安定した名前解決を提供します。
ApsaraVideo Player SDK は、Alibaba Cloud CDN ドメイン向けに強化された HTTPDNS を提供し、正確な CDN スケジューリングとリアルタイムの名前解決をサポートします。
強化 HTTPDNS の使用例
Enhanced HTTPDNS は Alibaba Cloud CDN ドメイン専用のサービスです。お使いのドメインが Alibaba Cloud CDN ドメインであり、かつ適切に設定されていることを確認してください。VOD で CDN ドメインを追加する場合、「アクセラレーションドメインの追加」をご参照ください。Alibaba Cloud CDN。
// 強化 HTTPDNS を有効化します。
AliPlayerGlobalSettings.enableEnhancedHttpDns(true);
// オプション: HTTPDNS の事前名前解決ドメインを追加します。
DomainProcessor.getInstance().addPreResolveDomain("player.***alicdn.com");
HTTP/2
Android プレーヤー SDK は、バージョン 5.5.0.0 以降、デフォルトで HTTP/2 が有効になります。
Android プレーヤー SDK は HTTP/2 プロトコルをサポートします。HTTP/2 は多重化によりヘッドオブラインブロッキングを回避し、再生パフォーマンスを向上させます。例:
AliPlayerGlobalSettings.setUseHttp2(true);
HTTP TCP 事前接続
HTTP ビデオ再生リクエスト (非 HTTPS) の場合、事前に TCP 接続を確立すると、ユーザーエクスペリエンスが大幅に向上し、ネットワーク接続時間が短縮され、即時かつ連続再生が確保され、ネットワークおよびシステムリソースの使用が最適化されます。使用法:
// ドメイン形式は host[:port] です。port は任意です。複数のドメインはセミコロン (;) で区切ります。
// グローバル設定。
// この設定は、呼び出すたびに指定された文字列で完全に更新されます。その結果、以前のリストと比較してドメインが追加または削除されます。空の文字列を指定すると事前接続は停止します。
AliPlayerGlobalSettings.setOption(AliPlayerGlobalSettings.SET_PRE_CONNECT_DOMAIN, "domain1;domain2");
動画ダウンロード
詳細なコード例については、API-Example の 動画ダウンロードとオフライン再生 (Download) モジュールをご参照ください。この ApsaraVideo Player SDK for Android 向けの Java ベースのサンプルプロジェクトは、デベロッパーが SDK 統合のコア機能を短時間で習得するのに役立ちます。
Android プレーヤー SDK は、Video on Demand (VOD) サービス向けの動画ダウンロード機能を提供し、ユーザーは ApsaraVideo Player を使用して動画をローカルにキャッシュできます。ダウンロード方式は、標準ダウンロードとセキュアダウンロードの 2 つです。
-
標準ダウンロード
ダウンロードした動画データは Alibaba Cloud によって暗号化されず、サードパーティ製プレーヤーで再生できます。
-
セキュアダウンロード
ダウンロードした動画データは Alibaba Cloud によって暗号化されます。サードパーティ製プレーヤーでは再生できません。ApsaraVideo Player のみが再生できます。
使用方法
-
動画ダウンロードをサポートするのは VidSts と VidAuth のみです。
-
プレーヤーの動画ダウンロード機能を使用するには、VOD コンソールでダウンロードモードを有効化して設定します。詳細な手順については、「オフラインダウンロード」をご参照ください。
-
動画ダウンロードはレジュームダウンロードに対応しています。
手順
-
任意: セキュアダウンロード用の暗号化検証ファイルを設定します。この設定は、セキュアダウンロードの場合にのみ必要で、標準ダウンロードでは不要です。
説明設定した暗号化検証ファイルがアプリ情報と一致していることをご確認ください。一致しない場合、動画ダウンロードに失敗します。
セキュアダウンロードの場合、動画のダウンロードと再生時に復号検証を行うために、VOD コンソールで生成されたキーファイルをプレーヤー SDK に設定します。キーファイルの生成については、「セキュアダウンロードの有効化」をご参照ください。
Application で 1 回だけ設定することを推奨します。例:
PrivateService.initService(getApplicationContext(), "Path to encryptedApp.dat file"); // encryptedApp.dat 検証ファイルをスマートフォンに保存し、ここにローカルファイルパスを設定することを推奨します。 -
ダウンローダーを作成して設定する。
AliDownloaderFactory を使用してダウンローダーを作成します。例:
AliMediaDownloader mAliDownloader = null; ...... // ダウンローダーを作成します。 mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); // ダウンロードの保存パスを設定します。 mAliDownloader.setSaveDir("Save folder path"); -
イベントリスナーを設定します。
ダウンローダーは複数のイベントリスナーを提供します。例:
-
ダウンロードソースを準備します。
ダウンロードソースを
prepareメソッドを使用して準備します。ダウンロードソースは VidSts および VidAuth メソッドに対応しています。例:-
VidSts
// VidSts を作成します。 VidSts aliyunVidSts = new VidSts(); aliyunVidSts.setVid("Vid information"); // 動画 ID (VideoId)。 aliyunVidSts.setAccessKeyId("<yourAccessKeyId>"); // Security Token Service (STS) の AssumeRole API を呼び出して生成された、一時的な STS AccessKey ペアの AccessKey ID。 aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>"); // Security Token Service (STS) の AssumeRole API を呼び出して生成された、一時的な STS AccessKey ペアの AccessKey secret。 aliyunVidSts.setSecurityToken("<yourSecurityToken>"); // Security Token Service (STS) の AssumeRole API を呼び出して生成された、Security Token Service (STS) トークン。 aliyunVidSts.setRegion("region"); // Video on Demand (VOD) サービスのリージョン。デフォルト値:cn-shanghai。 // VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にしていて、デフォルトのパラメーター名が MtsHlsUriToken の場合は、次のように config を設定して vid に渡す必要があります。 // VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にしていない場合は、次のコードをスキップしてください。 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); aliyunVidSts.setPlayerConfig(vidConfig); // ダウンロードソースを準備します。 mAliDownloader.prepare(aliyunVidSts) -
VidAuth
// VidAuth を作成します。 VidAuth vidAuth = new VidAuth(); vidAuth.setVid("Vid info");// 動画 ID。 vidAuth.setPlayAuth("<yourPlayAuth>");// VOD の GetVideoPlayAuth API を呼び出して生成された再生認証情報。 vidAuth.setRegion("Access region");// プレーヤー SDK バージョン 5.5.5.0 以降では、このパラメーターは非推奨であり、指定は不要です。プレーヤーがリージョンを自動的に解析します。5.5.5.0 より前のバージョンでは、このパラメーターは必須です。VOD のアクセスリージョンのデフォルトは cn-shanghai です。 // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしていて、デフォルトのパラメーター名が MtsHlsUriToken の場合は、次のように config を設定して vid に渡します。 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); vidAuth.setPlayerConfig(vidConfig); // ダウンロードソースを準備します。 mAliDownloader.prepare(vidAuth);
説明-
ソースファイルのフォーマットはダウンロードしたファイルのフォーマットと一致します。変更はできません。
-
VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしていて、デフォルトのパラメーター名が MtsHlsUriToken の場合は、「HLS 標準暗号化パラメーターのパススルー」をご参照のうえ、上記のとおり VOD ソースに MtsHlsUriToken の値を設定してください。
-
-
準備が完了したら、ダウンロード項目を選択してダウンロードを開始します。
準備が正常に完了すると、
OnPreparedListenerメソッドが呼び出されます。返された TrackInfo には、ビデオストリームの解像度などの情報が含まれています。ダウンロード用に Track を 1 つ選択します。例:public void onPrepared(MediaInfo mediaInfo) { // ダウンロード項目の準備に成功しました。 List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); // 例:最初の TrackInfo をダウンロードします。 mAliDownloader.selectItem(trackInfos.get(0).getIndex()); // ダウンロードを開始します。 mAliDownloader.start(); } -
(任意) ダウンロードソースの更新
VidSts と VidAuth の有効期限切れを防ぐために、ダウンロードソース情報を更新してダウンロードを開始できます。例:
// ダウンロードソースを更新します。 mAliDownloader.updateSource(aliyunVidSts); // ダウンロードを開始します。 mAliDownloader.start(); -
ダウンロードの成否にかかわらず、ダウンローダーを解放します。
ダウンロードが成功したら、
releaseメソッドをonCompletionまたはonErrorコールバックで呼び出してダウンローダーを解放します。例: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 暗号化のみをサポートしています。暗号化再生については、「暗号化再生」をご参照ください。
ネイティブ RTS 再生
Android プレーヤー SDK は、超低レイテンシーライブストリーミングを実現するため、ネイティブ RTS SDK を統合しています。詳細については、「Android で RTS ストリームをプルする実装」をご参照ください。