トラブルシューティング


「クリアテキストの HTTP トラフィックは許可されていません」の修正エラー

このエラーは、アプリがクリアテキスト HTTP トラフィック(つまり、 http://https:// ではなく http://)を指定 許可されません。Android 9(API レベル 28)以降をターゲットとするアプリの場合、クリアテキスト HTTP トラフィックは、デフォルトの構成では無効になっています。

アプリでクリアテキストの HTTP トラフィックを扱う必要がある場合は、 許可するネットワーク セキュリティ構成。Android の ネットワーク セキュリティ ドキュメント をご覧ください。すべてのクリアテキストの HTTP トラフィックを有効にするには、 android:usesCleartextTraffic="true" を、アプリの application 要素に追加 AndroidManifest.xml

ExoPlayer デモアプリはデフォルトのネットワーク セキュリティ構成を使用するため、 平文の HTTP トラフィックは許可されません。こちらの手順に沿って有効にできます。 ご覧ください。

「SSLHandshakeException」、「CertPathValidatorException」の修正および「ERR_CERT_AUTHORITY_INVALID」エラー

SSLHandshakeExceptionCertPathValidatorExceptionERR_CERT_AUTHORITY_INVALID はすべて、サーバーの SSL に問題があることを示します。 あります。これらのエラーは ExoPlayer 固有のものではありません。詳しくは、 Android の SSL ドキュメント をご覧ください。

一部のメディア ファイルがシークできないのはなぜですか?

デフォルトでは、ExoPlayer はメディアでのシークをサポートしていません。 正確なシーク操作を実行するには、プレーヤーが あります。ExoPlayer は、そのようなファイルをシーク不可とみなします。最新のメディア (例: サンプル インデックスなど)シーク用のメタデータが含まれ、 適切に定義されたシーク アルゴリズム(Ogg の補間二分割探索など) コンテンツのビットレートが固定されていることを示します。効率的なシーク操作は、 ExoPlayer がサポートします。

シークが必要なもののシークできないメディアがある場合は、 より適切なコンテナ形式を使用します。MP3、ADTS、AMR ファイルの場合 ファイルに定数があることを前提として、シークを有効にすることもできます。 指定されています。 こちらをご覧ください。

一部の MP3 ファイルでシーク動作が不正確になるのはなぜですか?

可変ビットレート(VBR)の MP3 ファイルは基本的に、 再生位置を厳密に指定する必要はありません。これには、次の 2 つの理由があります。

  1. 再生位置を厳密に調整するには、コンテナ形式で 時間対バイトのマッピングを行います。プレーヤーはこのマッピングにより リクエストしたシーク時間を対応するバイト オフセットまで移動し、リクエストを開始すると、 そのオフセットからメディアをパースして再生します。使用可能なヘッダーは このマッピングを MP3(XING ヘッダーなど)で指定すると、 不正確になります
  2. バイトからバイトへの正確なマッピングができないコンテナ形式(または いずれであっても)特定のタイムスタンプを コンテナがストリームに絶対サンプル タイムスタンプが含まれている場合にシークします。イン この場合、プレーヤーはシーク時間を、対応する バイト オフセット、そのオフセットからメディアのリクエストを開始し、最初の 絶対サンプル タイムスタンプを取得し、ガイド付きバイナリ検索を効果的に実行します。 適切なサンプルが見つかるまでメディアに取り込まれますMP3 は ストリームに絶対サンプル タイムスタンプが含まれているため、このアプローチは 考えています

以上の理由から、VBR MP3 ファイルに対して正確なシークを実行する唯一の方法は、 ファイル全体をスキャンし、ファイル内で時間-バイトのマッピングを手動で 表示されます。この戦略を有効にするには、FLAG_ENABLE_INDEX_SEEKING を使用します。 これは DefaultExtractorsFactory で設定できます。 setMp3ExtractorFlags。ただし、サイズの大きな MP3 ファイル、 ユーザーがストリーミングの終点付近までシークしようとしたときに 再生を開始した後、プレーヤーはダウンロードが完了するまで待機する必要がある シークを実行する前にストリーム全体をインデックスに登録しました。ExoPlayer では、 今回は精度よりも速度を最適化することに決めました そのため、FLAG_ENABLE_INDEX_SEEKING はデフォルトで無効になっています。

再生中のメディアをコントロールする場合は、より高度な 適切なコンテナ形式にする必要があります。Google が認識しているユースケースはありません MP3 が最適なメディア形式です。

動画内の移動が遅い理由

プレーヤーが動画の新しい再生位置に移動する際、次の 2 つの操作を行う必要があります。 :

  1. 新しい再生位置に対応するデータをバッファに読み込む (このデータがすでにバッファされている場合はその必要がないこともあります)。
  2. 動画デコーダをフラッシュし、前の I フレーム(キーフレーム)からデコードを開始する 新しい再生位置(ほとんどの動画で使用されるフレーム内コーディングによる) 構成されます。シークを正確(つまり、 再生がシーク位置で開始)、その間のすべてのフレームが シーク位置をデコードし、直ちに 破棄されます(画面には表示されません)。

(1)によって生じるレイテンシは、トラフィック量を増やすか、 プレーヤーによってメモリにバッファリングされたデータ、またはデータをディスクにプレキャッシュする場合。

(2)によって生じるレイテンシは、精度を低下させるか、 ExoPlayer.setSeekParameters を使用するか、動画を再エンコードして、シーク位置を指定します。 I フレームの頻度を高くする(出力ファイルが大きくなります)。

一部の MPEG-TS ファイルが再生できないのはなぜですか?

一部の MPEG-TS ファイルにはアクセス ユニット区切り文字(AUD)が含まれていません。デフォルトでは ExoPlayer は AUD を利用して、安価にフレーム境界を検出しています。同様に MPEG-TS ファイルに IDR キーフレームは含まれません。デフォルトでは、これらのタイプは ExoPlayer が考慮するキーフレームの数。

ExoPlayer が、ファイルを再生するよう求められたときに、バッファリング状態から先に進まないように見える AUD または IDR キーフレームのない MPEG-TS ファイル。そのようなファイルを再生する必要がある場合は、 そのためには、FLAG_DETECT_ACCESS_UNITS と それぞれ FLAG_ALLOW_NON_IDR_KEYFRAMES。これらのフラグは、 DefaultExtractorsFactory を使用setTsExtractorFlags または DefaultHlsExtractorFactory(次を使用: コンストラクタでアクセスできます。 FLAG_DETECT_ACCESS_UNITS の使用による副作用は、 AUD ベースのフレーム境界検出に比べて計算コストが高くなります。使用目的 FLAG_ALLOW_NON_IDR_KEYFRAMES が原因で、 一部の MPEG-TS ファイルを再生する際は、再生開始位置とシーク直後の間隔を指定します。

一部の MPEG-TS ファイルで字幕が見つからないのはなぜですか?

一部の MPEG-TS ファイルには CEA-608 トラックが含まれていますが、 ExoPlayer はコンテナ メタデータを検出できません。手動で 想定されるルートのリストを指定して、任意のサブタイトル トラックを指定します。 DefaultExtractorsFactory にサブタイトル形式(ユーザー補助機能を含む)を (MPEG-TS ストリーム内で識別するために使用できるチャネル)

Kotlin

val extractorsFactory =
  DefaultExtractorsFactory()
    .setTsSubtitleFormats(
      listOf(
        Format.Builder()
          .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
          .setAccessibilityChannel(accessibilityChannel)
          // Set other subtitle format info, such as language.
          .build()
      )
    )
val player: Player =
  ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()

Java

DefaultExtractorsFactory extractorsFactory =
    new DefaultExtractorsFactory()
        .setTsSubtitleFormats(
            ImmutableList.of(
                new Format.Builder()
                    .setSampleMimeType(MimeTypes.APPLICATION_CEA608)
                    .setAccessibilityChannel(accessibilityChannel)
                    // Set other subtitle format info, such as language.
                    .build()));
Player player =
    new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory))
        .build();

一部の MP4/FMP4 ファイルが正しく再生されないのはなぜですか?

一部の MP4/FMP4 ファイルには、 サンプルリストのスキップ、移動、または繰り返し。ExoPlayer は部分的なサポートあり [編集リストを適用]をクリックしますたとえば、サンプルのグループを遅らせたり繰り返したりできます。 同期サンプルで開始されますが、音声サンプルや メディアのプレロール: 同期サンプル以外で開始されない編集の場合。

メディアの一部が予期せず欠落または重複している場合は、 Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS を設定するか、 FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS が原因で、 編集リストを完全に無視するように指定できます。これらは setMp4ExtractorFlags を使用した DefaultExtractorsFactory または setFragmentedMp4ExtractorFlags

一部のストリームが HTTP レスポンス コード 301 または 302 で失敗するのはなぜですか?

HTTP レスポンス コード 301 と 302 はどちらもリダイレクトを示します。簡単な説明 ウィキペディアで確認できます。ExoPlayer がリクエストを行い、 ステータス コード 301 または 302 が返された場合、通常はリダイレクト 通常どおり再生を開始できます。これはデフォルトで行われないケースです クロスプロトコルリダイレクト用ですクロスプロトコル リダイレクトは、 HTTPS から HTTP へ(またはその逆に)変更したり、HTTPS から HTTP へ 構成されます。URL でクロスプロトコル リダイレクトが発生するかどうかをテストするには、 wget コマンドライン ツールを次のように使用します。

wget "https://yourserver.com/test.mp3" 2>&1  | grep Location

出力は次のようになります。

Location: https://second.com/test.mp3 [following]
Location: http://third.com/test.mp3 [following]

この例では、リダイレクトが 2 つあります。最初のリダイレクト元は https://yourserver.com/test.mp3 から https://second.com/test.mp3 に変更。どちらも クロスプロトコル リダイレクトではありません。2 つ目のリダイレクト先は https://second.com/test.mp3 から http://third.com/test.mp3 に変更。このリダイレクトは HTTPS から HTTP へのリダイレクトなど、複数のプロトコルをまたいだリダイレクトです。ExoPlayer は デフォルトの設定ではこのリダイレクトに従います。この場合、再生は失敗します。

必要に応じて、クロスプロトコル リダイレクトに従うように ExoPlayer を構成できます。 インスタンスで使用する DefaultHttpDataSource.Factory インスタンスをインスタンス化する際に、 説明します。ネットワーク スタックの選択と構成の詳細 こちらをご覧ください。

一部のストリームが UnrecognizedInputFormatException で失敗するのはなぜですか?

この質問は、次の形式の再生エラーに関するものです。

UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.

このエラーには 2 つの原因が考えられます。最も一般的な原因は DASH(mpd)、HLS(m3u8)、SmoothStreaming(ism、isml)を再生しようとしている 再生しようとしますが、プレーヤーはプログレッシブ ストリームとして再生しようとします。このような それぞれの ExoPlayer モジュールに依存する必要があります。次のような場合 ストリーム URI が標準のファイル拡張子で終わっていない場合は、 MimeTypes.APPLICATION_MPDMimeTypes.APPLICATION_M3U8、または MediaItem.BuilderMimeTypes.APPLICATION_SS から setMimeType に変更 ストリームのタイプを指定します。

あまり一般的ではない 2 つ目の原因は、ExoPlayer がコンテナをサポートしていないことです。 形式を指定します。この場合、失敗するのは 想定どおりに機能していますが、機能リクエストについては、 Issue Tracker(コンテナ形式やテスト ストリームの詳細を含む) 新しいリクエストを送信する前に、既存の機能リクエストを検索してください。

一部のデバイスで setPlaybackParameters が適切に動作しないのはなぜですか?

Android M 以前でアプリのデバッグビルドを実行する場合、 パフォーマンスの途切れ、音声のアーティファクト、CPU 使用率の上昇を setPlaybackParameters API を使用する。これは、最適化が 実行されているデバッグビルドでは、この API にとって重要な機能は できます。

この問題はデバッグビルドにのみ影響することに注意してください。サポートしない 最適化が常に有効になります。したがって、 エンドユーザーに提供するリリースは、この問題の影響を受けないようにしてください。

「Player が間違ったスレッドでアクセスされています」とはどういうものですか?エラーの意味は?

スタートガイドのスレッドに関する注意事項をご覧ください。

「予期しないステータス ライン: ICY 200 OK」を修正するにはどうすればよいですか?

この問題は、サーバーの応答に ICY ステータス行が含まれている場合に発生します。 HTTP に準拠したものとして処理します。ICY ステータス行は非推奨となり、 は使用しないでください。自分でサーバーを管理している場合は、 HTTP 準拠のレスポンスを返すことができますそれができない場合は、 この問題は ExoPlayer の OkHttp ライブラリで ICY を処理できるため、解決できます。 ステータス行を正しく読み取れます。

再生中のストリームがライブ ストリームかどうかを問い合わせるにはどうすればよいですか?

プレーヤーの isCurrentWindowLive メソッドをクエリできます。さらに、 isCurrentWindowDynamic をチェックして、ウィンドウが動的かどうかを確認できます (つまり、時間の経過とともに更新されます)。

アプリがバックグラウンドで動作しているときも、オーディオの再生を続けるにはどうすればよいですか?

アプリが使用中の場合でも音声の再生を継続するには、次の手順を行います。 説明します。

  1. 実行中のフォアグラウンド サービスが必要です。これにより リソースを解放できます
  2. WifiLockWakeLock を保持する必要があります。これにより、 Wi-Fi 無線と CPU がスリープ状態にならないようにします。これは、Kubernetes の Deployment を setWakeMode を呼び出して ExoPlayer にします。これにより、 必要なロックを適切なタイミングで取得、解放します。

ロックを解除して(setWakeMode を使用していない場合)停止することが重要です。 サービスは、音声が再生されなくなるとすぐにサービスに通知します。

ExoPlayer は私のコンテンツをサポートしているのに、ExoPlayer Cast ライブラリはサポートしていないのはなぜですか?

再生しようとしているコンテンツが、 CORS が有効キャスト フレームワークでは、コンテンツの CORS 対応を 必要があります。

コンテンツを再生できないのにエラーが表示されないのはなぜですか?

コンテンツを再生しているデバイスで、 特定のメディア サンプル形式をサポートしています。これは、 EventLogger をプレーヤーのリスナーとして使い、 出力します。

[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE

NO_UNSUPPORTED_TYPE は、デバイスがメディアをデコードできないことを意味します。 mimeType で指定されたサンプル形式。Android のメディア形式 ドキュメントをご覧ください。どうすれば デコード ライブラリを読み込んで再生に使用するのか」という質問もあります。

デコード ライブラリを読み込んで再生に使用するにはどうすればよいですか?

  • ほとんどのデコーダ ライブラリには、依存関係をチェックアウトしてビルドする手動ステップがあるため、 関連するライブラリの README に沿っていることを確認します。 たとえば、ExoPlayer の FFmpeg ライブラリでは、 (libraries/decoder_ffmpeg/README.md に記載されている手順( 設定フラグを使用して、再生する形式のデコーダを有効にします。
  • ライブラリにネイティブ コードが含まれている場合は、 Android NDK の README で指定されたバージョンに準拠する必要があります。また、 ビルド中に発生するエラーです。.so が表示されます。 各ファイルは、各フォルダのライブラリ パスの libs サブディレクトリに サポートされているアーキテクチャについて説明します。
  • デモ アプリケーションでライブラリを使用して再生を試すには、以下をご覧ください。 バンドルされたデコーダを有効にする。詳細については、次のライブラリの README をご覧ください: 独自のアプリからライブラリを使用する手順を確認できます。
  • DefaultRenderersFactory を使用している場合は、情報レベルが表示されます。 「Loaded FfmpegAudioRenderer」などのログ行が表示されます。デコーダが読み込まれたときに Logcat に記録されます。 ない場合は、アプリケーションが 使用します。
  • LibraryLoader からの警告レベルのログが Logcat に表示される場合、 は、ライブラリのネイティブ コンポーネントの読み込みに失敗したことを示します。もし ライブラリの README に沿っていることを確認します。 手順に従ったうえでエラーが出力されなかったことを確認します。

それでもデコード ライブラリの使用に関する問題が解決しない場合は、 Media3 Issue Tracker(関連する最近の問題)申請が必要な場合 ライブラリのネイティブ部分のビルドに関連している場合は、 参考にするために、README の手順を実行したときの完全なコマンドライン出力を含める 役立ちます

ExoPlayer で YouTube 動画を直接再生できますか?

いいえ。ExoPlayer は、次の形式の URL などの YouTube の動画を再生できません。 https://www.youtube.com/watch?v=...。代わりに、YouTube iframe Player API、 これは Android で YouTube を再生する公式の方法です。

動画の再生が途切れる

次のような場合は、デバイスがコンテンツを高速にデコードできないことがあります。 コンテンツのビットレートまたは解像度がデバイスの機能を超えています。場合によっては 低品質のコンテンツを使用して、そのようなデバイスで優れたパフォーマンスを発揮できるようにすること。

Android バージョンを搭載するデバイスで動画が途切れる Android 6.0(API レベル 23)から Android 11(API レベル 30)まで、 DRM で保護されたコンテンツや高フレームレートのコンテンツを再生する場合は、 非同期バッファ キューイングを有効にする必要があります。

不安定な API lint エラー

Media3 は API サーフェスのサブセットのバイナリ互換性を保証します。「 バイナリの互換性を保証しない部分には、 @UnstableApi。この違いを明確にするために、 API シンボルは、@OptIn アノテーションが付いていない限り、lint エラーを生成します。

@UnstableApi アノテーションが示すのは、API の品質やパフォーマンスに関するものではなく、単に「API 固定」ではない点だけです。

不安定な API lint エラーを処理する方法は 2 つあります。

  • 同じ結果を得られる安定した API に切り替える。
  • 引き続き不安定な API を使用し、次のように @OptIn のアノテーションを付けます。 表示されます。
@OptIn アノテーションを追加する

Android Studio を使用すると、次のようにアノテーションを追加できます。

<ph type="x-smartling-placeholder">
</ph> スクリーンショット: オプトイン アノテーションを追加する方法
図 2: Android Studio を使用して @androidx.annotations.OptIn アノテーションを追加する

Kotlin では、特定の使用サイトに手動でアノテーションを付けることもできます。

import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi

@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }

Java でも同じことが言えます。

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }

パッケージ全体をオプトインするには、package-info.java ファイルを追加します。

@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;

import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;

特定の lint エラーを抑制することで、プロジェクト全体をオプトインできます。 lint.xml ファイル:

 <?xml version="1.0" encoding="utf-8"?>
 <lint>
   <issue id="UnsafeOptInUsageError">
     <option name="opt-in" value="androidx.media3.common.util.UnstableApi" />
   </issue>
 </lint>

使用すべきでない kotlin.OptIn アノテーションもあります。です。 androidx.annotation.OptIn アノテーションを使用することが重要です。