ApsaraVideo Player SDK for Android に関する一般的な問題と、その解決策について説明します。
ライセンス関連の問題
無効または期限切れのライセンスに関する問題は、「ライセンス FAQ」をご参照ください。
プラットフォーム共通の問題
-
プラットフォームに依存しない問題については、「クロスプラットフォームプレーヤー FAQ」をご確認ください。
-
経験豊富な開発者は、再生エラーのトラブルシューティングを独自に行うこともできます。
開発に関する問題
現在の再生進捗の取得
プレーヤーSDKは、デフォルトで 500 ミリ秒ごとに再生進捗を報告します。必要に応じて、コールバック間隔を調整してください。
// コールバック間隔を変更します。
PlayerConfig config = mAliyunLivePlayer.getConfig();
config.mPositionTimerIntervalMs = 100;// コールバック間隔 (ミリ秒)。
mAliyunLivePlayer.setConfig(config);
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
if(infoBean.getCode() == InfoCode.CurrentPosition){
// 現在の再生進捗。
long currentPosition = infoBean.getExtraValue();
}
}
});
ソースの音声・映像データの取得
生の音声および映像データを取得するには、ソフトウェアデコードに切り替え、暗号化されていない動画を再生してください。
// ソフトウェアデコードに切り替えます。
mAliPlayer.enableHardwareDecoder(false);
IPlayer.RenderFrameCallbackConfig renderFrameCallbackConfig = new IPlayer.RenderFrameCallbackConfig();
// 内部の動画データアドレスのみを返すかどうかを指定します。デフォルト値はtrueです。
renderFrameCallbackConfig.mVideoDataAddr = false;
// 内部の音声データアドレスのみを返すかどうかを指定します。デフォルト値はfalseです。
renderFrameCallbackConfig.mAudioDataAddr = false;
mAliPlayer.setRenderFrameCallbackConfig(renderFrameCallbackConfig);
mAliPlayer.setOnRenderFrameCallback(new IPlayer.OnRenderFrameCallback() {
@Override
public boolean onRenderFrame(FrameInfo frameInfo) {
return false;
}
});
動画の幅と高さの取得
動画の幅と高さを取得するには、次のいずれかの方法を使用します。
-
AliPlayer インスタンスが
prepared状態になった後:mAliyunPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { mAliyunPlayer.getVideoWidth(); mAliyunPlayer.getVideoHeight(); } }); -
動画サイズの変更コールバックをリッスンします。
mAliyunPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { } }); -
トラック情報を使用します。
mAliyunPlayer.setOnTrackReadyListener(new IPlayer.OnTrackReadyListener() { @Override public void onTrackReady(MediaInfo mediaInfo) { List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); for (TrackInfo trackInfo : trackInfos) { if(trackInfo.getType() == TrackInfo.Type.TYPE_VIDEO){ trackInfo.getVideoWidth(); trackInfo.getVideoHeight(); } } } });
各動画フレームのピクセルデータの取得
ピクセルデータを取得するには、OnRenderFrameCallback コールバックをリッスンします。
player.setOnRenderFrameCallback(frameInfo -> {
if (frameInfo.frameType == FrameInfo.FrameType_video) {
// 動画データ
} else {
// 音声データ
}
return false;
});
ビットレート自動切り替えのロジック
mAliPlayer.selectTrack(TrackInfo.AUTO_SELECT_INDEX) を呼び出してビットレート自動切り替えを有効にすると、プレーヤーSDKはネットワーク速度を計算します。速度が次のビットレートレベルを 10 秒間維持できる場合、プレーヤーは切り替えを行います。それ以外の場合は、現在のビットレートを維持します。
-
高から低へ: ネットワーク速度が低下し、次の(より低い)ビットレートレベルを 10 秒間維持できる場合、プレーヤーはキャッシュされた高ビットレートのコンテンツを再生し終えてから切り替えます。
-
低から高へ: 速度がより高いビットレートを 10 秒間維持できると、プレーヤーはすぐに切り替えます。
ビットレート自動切り替えを使用するには、コンソールで動画をアダプティブビットレートストリームにトランスコードし、プレーヤーがそれを取得するように設定します。VidAuth を使用した例:
VidAuth vidAuth = new VidAuth();
List<Definition> list = new ArrayList<>();
list.add(Definition.DEFINITION_AUTO);
vidAuth.setDefinition(list);
カスタムリトライのロジック
デフォルトでは、プレーヤーSDKは 2 回リトライし、各試行のネットワークタイムアウトは 15 秒です。両方のリトライが失敗すると、Error コールバックが発生します。
リトライロジックをカスタマイズするには、リトライ回数を 0 に設定し、リトライイベントを外部で処理します。
PlayerConfig config = mAliPlayer.getConfig();
// 1. リトライ回数を設定します。この例では 0 に設定されています。
config.mNetworkRetryCount = 0;
mAliPlayer.setConfig(config);
mAliPlayer.setOnInfoListener(new IPlayer.OnInfoListener() {
@Override
public void onInfo(InfoBean infoBean) {
// 2. リトライイベントをリッスンします。
if(infoBean.getCode() == InfoCode.NetworkRetry){
// TODO: 必要に応じてロジックを実装します。
}
}
});
ARTC ストリーム再生中のunsupported protocolエラー
原因1: プレーヤーSDKは統合されていますが、ブリッジレイヤー (AlivcArtc) とリアルタイムストリーミング (RTS) コンポーネント (RtsSDK) が統合されていません。
解決策: 必要なコンポーネントを統合します。「AndroidでのRTSストリームのプル実装」をご参照ください。
原因2: ブリッジレイヤー (AlivcArtc) のバージョンがプレーヤーのバージョンと一致しません。
解決策: ブリッジレイヤー (AlivcArtc) とプレーヤーが同じバージョンであることを確認します。「AndroidでのRTSストリームのプル実装」をご参照ください。
原因3: RTSコンポーネント (RtsSDK) がロードされていません。
解決策: 必要に応じて、Application ファイルまたはターゲットのActivity でRTSコンポーネント (RtsSDK) をロードします。
static {
System.loadLibrary("RtsSDK");
}
原因4: minSDK のバージョンが高すぎて、ブリッジレイヤー (AlivcArtc) が正しくロードされていません。
// 1. minSdk を変更
minSdk を 21 にダウングレード
// 2. ARTC ライブラリを手動でロード
static {
System.loadLibrary("RtsSDK");
System.loadLibrary("cicada_plugin_artcSource");
}
シーク操作後にプログレスバーが逆戻りする
原因: プレーヤーはデフォルトで不正確シークを使用し、最も近いキーフレームから再生を開始するためです。
解決策: 正確シークモードに切り替えてください。
正確シークと不正確シークモードの切り替え方法
シークモードは次のように切り替えます。
// 不正確シーク
mAliPlayer.seekTo(1000);
mAliPlayer.seekTo(1000, IPlayer.SeekMode.Inaccurate);
// 正確シーク
mAliPlayer.seekTo(1000,IPlayer.SeekMode.Accurate);
正確シークモードに切り替えてもプログレスバーが逆戻りする
原因: シークポイントから最も近いキーフレームまでの距離が、最大正確シーク間隔を超えている場合、プレーヤーSDKは不正確シークにフォールバックし、プログレスバーがジャンプする原因となります。
解決策: 最大正確シーク間隔を増やすことで、不正確シークへのフォールバックを減らします。間隔を長くすると精度は向上しますが、シーク時間が増加する可能性があります。
// 単位:ミリ秒
mAliPlayer.setMaxAccurateSeekDelta(10000);
ローカルキャッシュ: キャッシュディレクトリを内部ストレージディレクトリに設定できますか?
はい、設定できます。ただし、アプリが必要なアクセス権限を持っていることを確認してください。
動画キャッシュ中の"encrypt check fail"エラー
セキュアダウンロードが有効になっている場合、暗号化検証ファイルはアプリ情報と一致している必要があります。「オフラインダウンロード」からファイルをダウンロードし、プレーヤーSDKに保存します。「動画のダウンロード」をご参照ください。ファイルが一致しない場合、キャッシュまたはダウンロードの失敗の原因となります。
再生に関する問題
プレーヤー作成時のクラッシュ
この問題は、次のようにトラブルシューティングしてください。
-
CPUアーキテクチャが x86 かどうかを確認してください。
プレーヤーSDKは、arm64-v8a および armeabi-v7a アーキテクチャのみをサポートしています。x86 アーキテクチャはサポートしていません。
-
プロジェクトに、プレーヤーSDKの .so ファイルと Maven 依存関係の両方が統合されていないか確認してください。
たとえば、
build.gradleで Maven 依存関係を使用してプレーヤーSDKを統合し、さらにプロジェクトのモジュールのlibsディレクトリにプレーヤー関連の動的ライブラリも統合している場合があります。推奨: 動的ライブラリを削除し、Maven 依存関係のみを使用します。動的ライブラリを使用する必要がある場合は、すべての .so ファイルが同じバージョンであることを確認してください。「SDKの統合」をご参照ください。プレーヤーに関連する動的ライブラリファイルは、
libalivcffmpeg.so、libsaasCorePlayer.so、libsaasDownloader.soです。 -
部分的なパッケージを統合した場合、AlivcFFmpeg のバージョン依存関係が正しいか確認してください。
AlivcFFmpeg のバージョン依存関係については、「AlivcFFmpegのバージョン依存関係」をご参照ください。
プレーヤー実行中のクラッシュ
この問題は、次のようにトラブルシューティングしてください。
-
クラッシュがプレーヤーSDK内で発生したかどうかを確認してください。
AliyunPlayerプレフィックスを持つクラッシュスタックがあるか確認します。このプレフィックスを持つスタックが存在する場合、問題はプレーヤーSDK内にあります。 -
プレーヤーSDKの最新バージョンにアップグレードし、問題が修正されているか確認してください。
-
問題が解決しない場合は、クラッシュファイル (すべてのスレッドを含む) 、クラッシュログ、およびシナリオの詳細を収集してください。「問題ログの取得方法」をご参照ください。
動画再生中の黒帯の表示
この問題は、次のようにトラブルシューティングしてください。
-
ソース動画自体に黒帯があるかどうかを確認してください。
-
次のインターフェイスを使用して、プレーヤーのスケーリングモードを調整できます。
/* SCALE_ASPECT_FILL:画面にアスペクト比を維持して合わせます。動画はクロップされます。 SCALE_ASPECT_FIT:動画をアスペクト比を維持してスケーリングします。黒帯が表示されることがあります。 SCALE_TO_FILL:アスペクト比を維持せずに画面いっぱいに表示します。動画は歪みます。 */ mAliPlayer.setScaleMode(); -
スケーリングモードがニーズを満たさない場合は、アプリケーションレイヤーで SurfaceView または TextureView のサイズを調整できます。
音声は再生されるが映像が表示されない
この問題は、次のようにトラブルシューティングしてください。
-
他のプレーヤーで動画を再生し、音声のみのファイルでないか確認してください。
-
表示ビューが正しく設定されており、再生インターフェイスから削除されていないことを確認してください。「基本機能」のステップ 4 に記載されているように、表示ビューを設定します。
読み取り権限のあるローカル動画再生時の"Invalid argument"エラー
ファイル名と絶対パスを確認してください。パスに中国語の文字とスペースを組み合わせることは避けてください。
読み取り権限のあるローカル動画再生時の"Permission denied"エラー
Android 10 (Android Q) 以降では、AndroidManifest.xml の application タグにandroid:requestLegacyExternalStorage="true" を追加して、対象範囲別ストレージ機能に対応してください。
動画再生中に"Redirect to a url"エラーが時々発生する
このエラーは、DNS ハイジャックが原因で発生する可能性があります。解決するには、「Android 用に HTTPDNS を設定する」をご参照ください。
全画面再生中にノッチ付き画面で黒い通知バーが点滅する
没入型ステータスバーを設定することで、この問題を解決できます。
MOV 動画の再生失敗
プレーヤーSDKは MOV 動画をサポートしています。ソースファイル内で moov アトムが mdat アトムの後に配置されている場合、再生が失敗することがあります。動画をトランスコードして、moov アトムを mdat アトムの前に移動してください。「ステップ2: ストリームのトラブルシューティング」をご参照ください。
初期化または再生中にプレーヤーSDKの.so 動的ライブラリが見つからないというエラーが発生する
この問題は、次のようにトラブルシューティングしてください。
-
CPUアーキテクチャが要件を満たしているか確認してください。
プレーヤーSDKは、arm64-v8a および armeabi-v7a アーキテクチャの動的ライブラリのみをサポートしています。
-
プレーヤーSDKのバージョンが古すぎないか確認してください。
プレーヤーSDK V5.4.6.0-full 以前を使用している場合は、V5.4.6.0-full-15467853 以降にアップグレードしてください。「Android SDKのリリースノート」をご参照ください。
AliListPlayer を使用してHLS (m3u8) 動画を再生する際のエラー
リストプレーヤーAliListPlayer は、V5.4.5.0 以降でHLS (m3u8) 動画をサポートしていますが、ローカルキャッシュを有効にする必要があります。「ローカルキャッシュ」をご参照ください。
AndroidプレーヤーSDKは、Androidプロジェクトのassetsおよびrawフォルダーからの動画再生をサポートしていますか?
いいえ、サポートしていません。動画をデバイスストレージにコピーし、絶対パスを使用して再生してください。
HLS 動画ストリームにローカルキャッシュを設定した後、403 エラーが発生して再生が失敗する
症状: ローカルキャッシュを有効にした状態で、VidAuth 再生方式を使用してHLS (M3U8) 動画ストリームを再生すると、再生が失敗し、403 エラーが報告されます。
原因: ローカルキャッシュを有効にした後、動画が完全にキャッシュされる前に再生を終了すると、次回再生を開始する際に、キャッシュされていない部分が前回のセッションの期限切れの VidAuth 情報を使用してリクエストされるため、認証が失敗し、403 エラーが発生します。
解決策: プレーヤーSDK V5.5.4.0 以降では、動画の再生URLに認証パラメーターが含まれ、再生プロトコルが HLS の場合、PlayerConfig.mEnableStrictAuthMode フィールドを設定して、異なる認証モードを選択できます。デフォルト値は false です。
-
非厳密認証 (false):認証はキャッシュされます。以前にメディアの一部のみがキャッシュされた場合、プレーヤーは後続のリクエストにキャッシュされた認証を使用します。URL 認証の有効期間が短い場合や、長時間の休止後に再生を再開した場合、認証が期限切れになる可能性があります。再生ソースの自動更新と統合して、認証の有効期限切れを処理してください。
-
厳密認証 (true):認証はキャッシュされません。認証は起動ごとに発生し、ネットワークがないと起動に失敗します。
AndroidプレーヤーSDKはダウンロード中の再生をサポートしていますか?
いいえ、サポートしていません。プレーヤーSDKは、ローカルキャッシュが有効な場合、再生中に動画ファイルをキャッシュおよびダウンロードします。キャッシュされたファイルは、次回の再生時に直接使用されます。キャッシュされたファイルを元のディレクトリから移動することはサポートされていません。
AndroidプレーヤーSDKは、動画のバッファリング速度の取得をサポートしていますか?
はい、サポートしています。プレーヤーSDKでは、バッファリング速度、リアルタイムレンダリングフレームレート、音声と動画のビットレート、およびネットワークダウンロードビットレートを取得できます。「再生情報の取得」をご参照ください。
HDR 動画の異常な再生
プレーヤーSDKは現在、回転角度を持つ HDR 動画をサポートしていません。これらの動画では再生エラーが発生する可能性があります。
動画が複数の画質にトランスコードされた場合、プレーヤーSDKはデフォルトでどの画質を再生しますか?
デフォルトの再生順序は、FD、LD、SD、HD、2K、4K、ODです。「画質」をご参照ください。プレーヤーSDKは、この順序で利用可能な最初の画質を再生します。
デフォルトの再生画質を指定する方法
例:
// VidSts 再生方式を例として使用します。
VidSts vidSts = new VidSts();
// vid、AccessKeyId、AccessKeySecret、token などのパラメーターを設定するコードは省略されています。詳細については、「基本機能」トピックのプレーヤー作成設定をご参照ください。
/*
パラメーター 1: 目的の再生画質。有効な値: FD、LD、SD、HD、2K、4K、OD。
パラメーター 2: 目的の画質の再生を強制するかどうかを指定します。false : 目的の画質の再生を強制しません。プレーヤーSDKは、デフォルトの順序に基づいて再生する画質を検索します。true : 目的の画質の再生を強制します。目的の画質が見つからない場合、動画は再生されません。
*/
vidSts.setQuality("",false);
ある画質に複数のストリームがある場合、プレーヤーSDKはどのストリームを再生しますか?
ある画質に複数のストリームがある場合、プレーヤーSDKは最新のストリームを再生します。
その他の問題
ウォーターマークなしで動画を再生し、ウォーターマーク付きでダウンロードする方法
動画を複数の画質にトランスコードします。ウォーターマークのない画質を再生し、ウォーターマークのある画質をダウンロードしてください。
問題ログの取得方法
Alibaba Cloud のテクニカルサポートが問題をより迅速に解決できるよう、問題ログを提出してください。
-
問題ログを取得してください。
ログを収集する前に、ログレベルを
AF_LOG_LEVEL_TRACEに設定してください。「SDKログの取得」をご参照ください。 -
生成されたログを Alibaba Cloud のテクニカルサポートに提供してください。