ExoPlayer デモ アプリケーション

ExoPlayer のメインのデモアプリは、主に次の 2 つの目的を担っています。

  1. ExoPlayer の使用例を比較的シンプルかつ完全に機能させることができます。 デモアプリは、開発の出発点として便利です。 開発できます
  2. ExoPlayer を簡単に試せるようにしました。デモアプリを使用して再生をテストできます。 サンプルに加えて独自のコンテンツを作成します。

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

コードの取得

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

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

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

Android Studio のプロジェクト

コンパイルと実行

デモアプリをコンパイルして実行するには、demo 構成を選択して実行します。 Android Studioデモアプリは、接続された Android デバイスにインストールされ、実行されます。 可能であれば、実機を使用することをおすすめします。エミュレータで サポートされているデバイスのエミュレータのセクションを参照し、 仮想デバイスが 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 ファイルの読み込み

デモアプリでは、上記のスキーマを使用して外部 JSON ファイルを読み込むことができます。 *.exolist.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 を、 試聴しますこのようなインテントは、次のコマンドを使用してターミナルから実行できます。

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

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

  • 構成の付加情報の例: <ph type="x-smartling-placeholder">
      </ph>
    • mime_type [文字列] MIME タイプのヒントのサンプル。たとえば DASH コンテンツの場合は application/dash+xml
    • clip_start_position_ms [Long] サンプルが移動される開始点 ミリ秒単位です。
    • clip_end_position_ms [Long] 標本の始点となる終点 ミリ秒単位です。
    • drm_scheme(文字列)DRM スキーム(保護されている場合)。有効な値は widevine です。 playreadyclearkey。DRM スキームの UUID も使用できます。
    • drm_license_uri(文字列)ライセンス サーバーの 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 拡張機能][]。
    • prefer_extension_decoders [ブール値] 拡張機能デコーダが おすすめします

adb shell am start を使用してインテントを起動する場合、オプションの文字列エクストラを --es を使用して設定します(例:--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。サンプル構成 エクストラは androidx.media3.demo.main.action.VIEW と同じです。 2 つの違いがあります。

  • 特典キーにはアンダースコアと 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