このトピックでは、Android プレーヤーソフトウェア開発キット (SDK) をご利用の際によくある問題とそのソリューションについて説明します。
ライセンスに関する問題
無効なライセンスや期限切れのライセンスなどの問題については、「ライセンスに関するよくある質問」をご参照ください。
各クライアントのプレーヤーに共通する問題
どのクライアントでも発生する可能性のある問題については、「プレーヤーのよくある質問」をご参照ください。
開発経験がある場合は、「ご自身で再生例外のトラブルシューティングを行う」こともできます。
開発に関する問題
現在の再生進捗の取得方法
デフォルトでは、プレーヤー SDK は 500 ms ごとに再生進捗のコールバックを提供します。このコールバック間隔は変更できます。現在の再生進捗をより頻繁に取得するには、間隔を短くします。次のコードに例を示します。
// コールバック間隔を変更します。
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;
}
});動画の幅と高さの取得
動画の幅と高さは、次の 3 つの方法のいずれかで取得できます。
AliPlayer インスタンスが `prepare` メソッドを完了し、`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(); } } } });
プレーヤー内の各動画フレームのピクセル取得方法
Android プレーヤーの場合、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` コールバックがトリガーされます。
リトライロジックはカスタマイズできます。リトライがトリガーされると、リトライイベントが外部サービスに送信され、特定のリトライロジックが決定されます。次のコードに例を示します。
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);ローカルキャッシュ:キャッシュディレクトリを内部ストレージディレクトリに設定可能か
はい、可能です。Android デバイスの外部ストレージディレクトリを内部ストレージディレクトリに変更できます。ただし、キャッシュが正しく機能するためには、内部ストレージディレクトリへのアクセス権限があることを確認する必要があります。
動画キャッシュ中の「encrypt check fail」エラー
キャッシュはダウンロードに似ています。セキュアダウンロードが有効になっている場合は、暗号化検証ファイルがご利用のアプリ情報と一致していることを確認する必要があります。「オフラインダウンロード」で生成された暗号化検証ファイルをダウンロードし、プレーヤー SDK に保存する必要があります。詳細については、「動画のダウンロード」をご参照ください。そうしないと、キャッシュまたはダウンロードが失敗します。
再生に関する問題
プレーヤー作成時のクラッシュ
次の手順で問題をトラブルシューティングします。
CPU アーキテクチャが x86 かどうかを確認します。
プレーヤー SDK は arm64-v8a と armeabi-v7a アーキテクチャのみをサポートしており、x86 アーキテクチャはサポートしていません。
プレーヤー SDK の .so ファイルと Maven 依存関係の両方がプロジェクトに統合されているかどうかを確認します。
たとえば、`build.gradle` で Maven 依存関係を使用してプレーヤー SDK を統合し、さらにプロジェクトのモジュールの `libs` ディレクトリにプレーヤー関連の動的ライブラリも統合している場合があります。
推奨されるソリューション:両方の方法を使用している場合は、動的ライブラリを削除し、Maven 依存関係のみを使用してください。動的ライブラリを統合する必要がある場合は、すべてのプレーヤー SDK 関連の .so ファイルが同じバージョンであることを確認してください。プレーヤー SDK の統合方法と動的ライブラリの取得方法については、「SDK の統合」をご参照ください。次の図は、プレーヤー関連の動的ライブラリを示しています。

部分的なパッケージを統合した場合、AlivcFFmpeg のバージョン依存関係が正しいことを確認します。
AlivcFFmpeg のバージョン依存関係については、「AlivcFFmpeg のバージョン依存関係」をご参照ください。
プレーヤー実行中のクラッシュ
次の手順で問題をトラブルシューティングします。
クラッシュがプレーヤー SDK 内で発生したかどうかを確認します。
AliyunPlayerプレフィックスを持つクラッシュスタックがあるか確認します。このプレフィックスを持つスタックが存在する場合、問題はプレーヤー SDK 内にあります。プレーヤー SDK の最新バージョンにアップグレードし、問題が修正されているか確認します。
問題が解決しない場合は、関連するクラッシュファイル (すべてのスレッドを含む)、クラッシュログ、およびクラッシュシナリオ情報をご用意ください。詳細については、「問題ログの取得方法」をご参照ください。
動画再生中の黒枠の表示
次の手順で問題をトラブルシューティングします。
元の動画自体に黒枠があるかどうかを確認します。
次のインターフェイスを使用して、プレーヤーのスケーリングモードを調整できます。
/* SCALE_ASPECT_FILL:画面に比例して塗りつぶします。動画はトリミングされます。 SCALE_ASPECT_FIT:動画を比例してスケーリングします。黒枠が表示される場合があります。 SCALE_TO_FILL:比率を維持せずに画面を塗りつぶします。動画は歪みます。 */ mAliPlayer.setScaleMode();スケーリングモードがニーズを満たさない場合は、アプリケーション層で SurfaceView または TextureView のサイズを調整できます。
音声は再生されるが映像が表示されない
次の手順で問題をトラブルシューティングします。
別のプレーヤーで動画を再生し、音声のみのファイルかどうかを確認します。
動画をレンダリングするビューが正しく設定されていることを確認します。たとえば、プレーヤーに表示ビューが設定されているか、再生インターフェイスから削除されていないかを確認します。表示ビューの設定方法については、「基本機能」のステップ 4 をご参照ください。
読み取り権限のあるローカル動画再生時の「Invalid argument」エラー
読み取り権限のあるローカル動画を再生する際に「Invalid argument」エラーが発生した場合、ファイル名と絶対パスを確認してください。パスに中国語の文字とスペースの組み合わせを使用しないでください。
読み取り権限のあるローカル動画再生時の「Permission denied」エラー
Android 10 (Android Q) 以降を実行しているデバイスでストレージ権限を正しく使用するには、AndroidManifest.xml の application タグに android:requestLegacyExternalStorage="true" を追加する必要があります。これは、これらの Android バージョンでスコープ付きストレージ機能が導入されたためです。
動画再生中に「Redirect to a url」エラーが時々発生する
このエラーは、再生中の動画のソースがハイジャックされているために発生する可能性があります。この問題を解決するために、プレーヤーの HTTPDNS 機能を有効にすることを推奨します。詳細については、「Android の HTTPDNS の設定」をご参照ください。
ノッチ付き画面での全画面再生中に黒い通知バーが点滅する
この問題は、イマーシブステータスバーを設定することで解決できます。
MOV 動画の再生失敗
Android プレーヤー SDK は MOV フォーマットの動画をサポートしています。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 以降のバージョンにアップグレードすることを推奨します。プレーヤー SDK の最新および過去のバージョンについては、「Android SDK リリースノート」をご参照ください。
AliListPlayer を使用した HLS (m3u8) 動画再生時のエラー
V5.4.5.0 より前のバージョンのプレーヤー SDK は、リストプレーヤー AliListPlayer を使用した HLS (m3u8) 動画の再生をサポートしていません。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 はダウンロード中の再生をサポートしているか
いいえ、サポートしていません。Android プレーヤー SDK は、ローカルキャッシュ機能を有効にすると、再生中に動画ファイルをキャッシュおよびダウンロードすることをサポートしています。次回動画を再生する際には、キャッシュされたファイルが直接再生されます。現在、SDK は元のファイルディレクトリから移動されたローカルにキャッシュされた動画ファイルの再生をサポートしていません。
Android プレーヤー SDK は動画のバッファリング速度の取得をサポートしているか
はい、サポートしています。Android プレーヤー SDK は、バッファリング速度、リアルタイムレンダリングフレームレート、音声および映像ビットレート、ネットワークダウンロードビットレートの取得をサポートしています。詳細については、「再生情報の取得」をご参照ください。
HDR 動画の再生異常
現在、Android プレーヤー 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);1 つの定義に複数のストリームがある場合、プレーヤー SDK はどのストリームを再生しますか?
1つの解像度に複数のストリームがある場合、プレーヤー SDK は最新のストリームを再生します。
その他の問題
ウォーターマークなしで動画を再生し、ウォーターマーク付きでダウンロードする方法
動画を複数の解像度にトランスコードします。ウォーターマークのない解像度を再生し、ウォーターマークのある解像度をダウンロードします。
問題ログの取得方法
Alibaba Cloud のテクニカルサポートにリクエストする際、問題ログを提出すると、問題解決の効率が向上します。問題ログは次の手順で取得できます。
問題ログを取得します。
問題ログを取得する前に、ログレベルを
AF_LOG_LEVEL_TRACEに設定することを推奨します。詳細については、「SDK ログの取得」をご参照ください。生成されたログを Alibaba Cloud のテクニカルサポートに提供します。