ExoPlayer デモ アプリケーション

ExoPlayer のメインのデモアプリは、主に次の 2 つの目的を果たします。

  1. ExoPlayer の使用例として、比較的シンプルながらも機能が充実したサンプルを提供すること。デモアプリは、独自のアプリを開発する出発点として便利です。
  2. ExoPlayer を簡単に試すことができます。デモアプリを使用すると、付属のサンプルに加えて、独自のコンテンツの再生をテストできます。

このページでは、デモアプリを取得、コンパイル、実行する方法と、独自のメディアを再生する方法について説明します。

コードの取得

メインのデモアプリのソースコードは、GitHub プロジェクトdemos/main フォルダにあります。プロジェクトのクローンをローカル ディレクトリにまだ作成していない場合は、作成します。

git clone https://github.com/androidx/media.git

次に、Android Studio でプロジェクトを開きます。[Android Project] ビューに次のものが表示されます(このデモアプリの関連フォルダは開いています)。

Android Studio のプロジェクト

コンパイルと実行

デモアプリをコンパイルして実行するには、Android Studio で demo 構成を選択して実行します。デモアプリは、接続された Android デバイスにインストールされ、実行されます。可能であれば、実機を使用することをおすすめします。代わりにエミュレータを使用する場合は、サポートされているデバイスのエミュレータのセクションを読み、Virtual Device で API レベルが 23 以上のシステム イメージが使用されていることを確認してください。

SampleChooserActivity と PlayerActivity

このデモアプリは、サンプルのリスト(SampleChooserActivity)を表示します。サンプルを選択すると、再生用の 2 つ目のアクティビティ(PlayerActivity)が開きます。このデモには、再生コントロールとトラック選択機能が含まれています。また、ExoPlayer の EventLogger ユーティリティ クラスを使用して、有用なデバッグ情報をシステムログに出力します。このロギングは、次のコマンドで(他のタグのエラーレベルのロギングとともに)表示できます。

adb logcat EventLogger:V *:E

バンドルされたデコーダの有効化

ExoPlayer には、AV1、VP9、Opus、FLAC、FFmpeg(音声のみ)など、バンドルされたソフトウェア デコーダを使用できる拡張機能がいくつかあります。デモアプリは、次のようにこれらの拡張機能を追加して使用するように構築できます。

  1. 含めたい拡張機能をそれぞれ作成します。これは手動プロセスです。手順については、各拡張機能の README.md ファイルを参照してください。
  2. Android Studio の [Build Variants] ビューで、次の画像のように、デモ モジュールのビルド バリアントを withDecoderExtensionsDebug または withDecoderExtensionsRelease に設定します。

    デモのビルド バリアント「withDecoderExtensionsDebug」を選択する

  3. 通常どおり、demo 構成をコンパイル、インストール、実行します。

デフォルトでは、適切なプラットフォーム デコーダが存在しない場合にのみ、拡張機能デコーダが使用されます。次のセクションで説明するように、拡張機能デコーダを優先するように指定できます。

自分のコンテンツを再生する

デモアプリで独自のコンテンツを再生する方法は複数あります。

1. assets/media.exolist.json の編集

デモアプリに表示されるサンプルは assets/media.exolist.json から読み込まれます。この JSON ファイルを編集することで、デモアプリにサンプルを追加したり、デモアプリにサンプルを削除したりできます。スキーマは次のとおりです。[O] はオプションの属性を示します。

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of sample",
        "uri": "The URI of the sample",
        "extension": "[O] Sample type hint. Values: mpd, ism, m3u8",
        "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
        "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
        "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
        "drm_license_uri": "[O] URI of the license server if protected",
        "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
        "drm_key_request_properties": "[O] Key request headers if protected",
        "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
        "drm_multi_session": "[O] Enables key rotation if protected",
        "subtitle_uri": "[O] The URI of a subtitle sidecar file",
        "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
        "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
        "ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
      },
      ...etc
    ]
  },
  ...etc
]

サンプルのプレイリストは、スキーマを使用して指定できます。

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of playlist sample",
        "playlist": [
          {
            "uri": "The URI of the first sample in the playlist",
            "extension": "[O] Sample type hint. Values: mpd, ism, m3u8"
            "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
            "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
            "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
            "drm_license_uri": "[O] URI of the license server if protected",
            "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
            "drm_key_request_properties": "[O] Key request headers if protected",
            "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
            "drm_multi_session": "[O] Enables key rotation if protected",
            "subtitle_uri": "[O] The URI of a subtitle sidecar file",
            "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
            "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
          },
          {
            "uri": "The URI of the second sample in the playlist",
            ...etc
          },
          ...etc
        ]
      },
      ...etc
    ]
  },
  ...etc
]

必要に応じて、キー リクエスト ヘッダーは、各ヘッダーの文字列属性を含むオブジェクトとして指定します。

"drm_key_request_properties": {
  "name1": "value1",
  "name2": "value2",
  ...etc
}

サンプル選択アクティビティのオーバーフロー メニューには、拡張機能デコーダを優先するかどうかを指定するオプションが含まれています。

ローカル ファイルの URI と対象範囲別ストレージの制限

ローカル ファイルの URI を指定する際、デモアプリはこれらのファイルの読み取りに必要なストレージ アクセス権限をリクエストします。ただし、Android 13 以降では、一般的なメディア ファイル拡張子(.mp4 など)で終わらない任意のファイルを読み込むことはできません。このようなファイルを読み込む必要がある場合は、アクセス制限のないデモアプリ固有のストレージ ディレクトリに配置します。通常、このファイルは /sdcard/Android/data/androidx.media3.demo.main/files にあります。

2. 外部 exolist.json ファイルの読み込み

デモアプリでは、上記のスキーマを使用して、*.exolist.json の規則に従って名前を付けた外部 JSON ファイルを読み込むことができます。たとえば、このようなファイルを https://yourdomain.com/samples.exolist.json にホストする場合は、次のようにしてデモアプリで開くことができます。

adb shell am start -a android.intent.action.VIEW \
    -d https://yourdomain.com/samples.exolist.json

デモアプリがインストールされているデバイスで *.exolist.json リンク(ブラウザやメール クライアントなど)をクリックすると、デモアプリでも開きます。したがって、*.exolist.json JSON ファイルをホストすると、他のユーザーがデモアプリで試すためのコンテンツを簡単に配布できます。

3. インテントを起動する

インテントを使用すると、試聴リストをスキップして直接再生を開始できます。1 つのサンプルを再生するには、インテントのアクションを androidx.media3.demo.main.action.VIEW に設定し、データ URI を再生するサンプルの URI に設定します。このようなインテントをターミナルから発行するには、次のようにします。

adb shell am start -a androidx.media3.demo.main.action.VIEW \
    -d https://yourdomain.com/sample.mp4

単一のサンプル インテントでサポートされるオプションのエクストラは次のとおりです。

  • 構成の追加情報の例:
    • mime_type [String] サンプルの MIME タイプ ヒント。たとえば、DASH コンテンツの場合は application/dash+xml です。
    • clip_start_position_ms [Long] サンプルをクリップする開始ポイント(ミリ秒単位)。
    • clip_end_position_ms [長] サンプルをクリップするエンドポイント(ミリ秒単位)。
    • drm_scheme [String] 保護されている場合の DRM スキーム。有効な値は widevineplayreadyclearkey です。DRM スキームの UUID も使用できます。
    • drm_license_uri [String] 保護されている場合のライセンス サーバー URI。
    • drm_force_default_license_uri [ブール値] 独自のライセンス URI を含む鍵リクエストで drm_license_uri を強制的に使用するかどうか。
    • drm_key_request_properties [文字列配列] 保護されている場合、name1、value1、name2、value2 などとしてパックされたキー リクエスト ヘッダー。
    • drm_session_for_clear_content [ブール値] 動画トラックと音声トラックをクリアする DRM セッションをアタッチするかどうか。
    • drm_multi_session [ブール値] 保護されている場合に鍵のローテーションを有効にします。
    • subtitle_uri [文字列] 字幕サイドカー ファイルの URI。
    • subtitle_mime_type [文字列] subtitle_uri の MIME タイプ(subtitle_uri が設定されている場合は必須)。
    • subtitle_language [文字列] 字幕ファイルの BCP47 言語コード(subtitle_uri が設定されていない場合は無視されます)。
    • ad_tag_uri [文字列] [IMA 拡張機能][] を使用して読み込む広告タグの URI。
    • prefer_extension_decoders [ブール値] プラットフォームのデコーダよりも拡張機能のデコーダを優先するかどうか。

adb shell am start を使用してインテントを起動する場合は、--es を使用してオプションの文字列 Extra を設定できます(例: --es extension mpd)。省略可能なブール値エクストラは --ez で設定できます(例: --ez prefer_extension_decoders TRUE)。オプションの長いエクストラは --el で設定できます(例: --el clip_start_position_ms 5000)。オプションの文字列配列の追加は --esa で設定できます(例:--esa drm_key_request_properties name1,value1)。

サンプルのプレイリストを再生するには、インテントのアクションを androidx.media3.demo.main.action.VIEW_LIST に設定します。サンプル構成のエクストラは、次の 2 つの違いを除き、androidx.media3.demo.main.action.VIEW と同じです。

  • エクストラのキーには、アンダースコアとサンプルの 0 ベースのインデックスを接尾辞として指定する必要があります。たとえば、extension_0 は最初のサンプルのサンプルタイプをヒントします。drm_scheme_1 は、2 番目のサンプルの DRM スキームを設定します。
  • サンプルの URI は、キー uri_<sample-index> を持つ追加情報として渡されます。

サンプルに依存しないその他のエクストラは変更されません。たとえば、ターミナルで次のコマンドを実行すると、2 つのアイテムを含む再生リストを再生し、2 つ目のアイテムの拡張子をオーバーライドできます。

adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \
    --es uri_0 https://a.com/sample1.mp4 \
    --es uri_1 https://b.com/sample2.fake_mpd \
    --es extension_1 mpd