ExoPlayer-Demoanwendung

Die Haupt-Demo-App von ExoPlayer dient hauptsächlich zwei Zwecken:

  1. Um ein relativ einfaches, aber voll funktionsfähiges Beispiel für die Verwendung von ExoPlayer zu liefern. Die Demo-App kann ein bequemer Ausgangspunkt für die Entwicklung Ihrer eigenen App sein.
  2. So können Sie ExoPlayer einfacher ausprobieren. Mit der Demo-App kannst du zusätzlich zu den enthaltenen Beispielen die Wiedergabe deiner eigenen Inhalte testen.

Auf dieser Seite wird beschrieben, wie Sie die Demo-App abrufen, kompilieren und ausführen. Außerdem wird beschrieben, wie Sie sie zum Abspielen Ihrer eigenen Medien verwenden.

Code abrufen

Den Quellcode für die Hauptdemo-App finden Sie im Ordner demos/main unseres GitHub-Projekts. Falls noch nicht geschehen, klonen Sie das Projekt in ein lokales Verzeichnis:

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

Öffnen Sie dann das Projekt in Android Studio. In der Android-Projektansicht sollten Sie Folgendes sehen (die relevanten Ordner der Demo-App wurden maximiert):

Das Projekt in Android Studio

Kompilieren und ausführen

Wählen Sie die demo-Konfiguration in Android Studio aus, um die Demo-App zu kompilieren und auszuführen. Die Demo-App wird auf einem verbundenen Android-Gerät installiert und ausgeführt. Wir empfehlen, nach Möglichkeit ein physisches Gerät zu verwenden. Wenn Sie stattdessen einen Emulator verwenden möchten, lesen Sie unter Unterstützte Geräte den Abschnitt „Emulatoren“ und achten Sie darauf, dass Ihr virtuelles Gerät ein Systemimage mit einem API-Level von mindestens 23 verwendet.

SamplechooserActivity und PlayerActivity

Die Demo-App zeigt eine Liste von Beispielen (SampleChooserActivity). Wenn Sie ein Beispiel auswählen, wird eine zweite Aktivität (PlayerActivity) zur Wiedergabe geöffnet. Die Demo umfasst Wiedergabesteuerungen und eine Funktion zur Titelauswahl. Außerdem wird die Dienstprogrammklasse EventLogger von ExoPlayer verwendet, um nützliche Debug-Informationen in das Systemlog zu übertragen. Dieses Logging kann (zusammen mit dem Logging auf Fehlerebene für andere Tags) mit dem folgenden Befehl aufgerufen werden:

adb logcat EventLogger:V *:E

Gebündelte Decoder aktivieren

ExoPlayer verfügt über eine Reihe von Erweiterungen, die die Verwendung von Software-Decodern ermöglichen, darunter AV1, VP9, Opus, FLAC und FFmpeg (nur Audio). So kann die Demo-App diese Erweiterungen enthalten und verwenden:

  1. Erstellen Sie alle Erweiterungen, die Sie einbinden möchten. Beachten Sie, dass dies ein manueller Prozess ist. Eine Anleitung finden Sie in der Datei README.md der jeweiligen Erweiterung.
  2. Legen Sie in der Ansicht „Build-Varianten“ von Android Studio die Build-Variante für das Demomodul auf withDecoderExtensionsDebug oder withDecoderExtensionsRelease fest, wie in der folgenden Abbildung gezeigt.

    Demo-Build-Variante „withDecoderExtensionsDebug“ auswählen

  3. Kompilieren Sie die demo-Konfiguration, installieren Sie sie und führen Sie sie wie gewohnt aus.

Standardmäßig wird nur dann ein Erweiterungsdecoder verwendet, wenn kein geeigneter Plattformdecoder vorhanden ist. Sie können angeben, dass Erweiterungsdecoder bevorzugt werden sollen, wie in den folgenden Abschnitten beschrieben.

Eigene Inhalte wiedergeben

Sie haben mehrere Möglichkeiten, Ihre eigenen Inhalte in der Demo-App abzuspielen.

1. „Assets/media.exolist.json“ bearbeiten

Die in der Demo-App aufgeführten Beispiele werden von assets/media.exolist.json geladen. Durch das Bearbeiten dieser JSON-Datei können Sie Beispiele zur Demo-App hinzufügen und daraus entfernen. Das Schema lautet wie folgt, wobei [O] für ein optionales Attribut steht.

[
  {
    "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
]

Playlists von Beispielen können mithilfe des folgenden Schemas angegeben werden:

[
  {
    "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
]

Schlüsselanfrageheader werden bei Bedarf als Objekt angegeben, das für jeden Header ein Stringattribut enthält:

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

In der Beispielauswahlaktivität enthält das Dreipunkt-Menü Optionen, mit denen angegeben werden kann, ob Erweiterungsdecodierer bevorzugt werden sollen.

Lokale Datei-URIs und bereichsspezifische Speichereinschränkungen

Beim Angeben lokaler Datei-URIs fordert die Demo-App die erforderlichen Speicherzugriffsberechtigungen zum Lesen dieser Dateien an. Ab Android 13 ist es jedoch nicht möglich, beliebige Dateien zu laden, die nicht mit einer typischen Mediendateierweiterung wie .mp4 enden. Wenn Sie eine solche Datei laden müssen, können Sie sie im spezifischen Speicherverzeichnis der Demo-App ohne Zugriffsbeschränkungen ablegen. Sie befindet sich normalerweise unter /sdcard/Android/data/androidx.media3.demo.main/files.

2. Externe exolist.json-Datei laden

Die Demoanwendung kann externe JSON-Dateien mithilfe des obigen Schemas laden und gemäß der *.exolist.json-Konvention benannt werden. Wenn Sie eine solche Datei beispielsweise unter https://yourdomain.com/samples.exolist.json hosten, können Sie sie mit dem folgenden Befehl in der Demo-App öffnen:

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

Wenn Sie auf einem Gerät, auf dem die Demo-App installiert ist, auf einen *.exolist.json-Link (z. B. im Browser oder E-Mail-Client) klicken, wird sie auch in der Demo-App geöffnet. Wenn Sie eine *.exolist.json-JSON-Datei hosten, können Sie Inhalte ganz einfach an andere Nutzer in der Demo-App verteilen.

3. Intent auslösen

Mit Intents können Sie die Liste der Beispiele umgehen und direkt bei der Wiedergabe starten. Wenn Sie ein einzelnes Beispiel wiedergeben möchten, legen Sie die Aktion des Intents auf androidx.media3.demo.main.action.VIEW und den Daten-URI auf die Aktion des wiederzugebenden Beispiels fest. Ein solcher Intent kann vom Terminal folgendermaßen ausgelöst werden:

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

Folgende optionale Extras werden für einen einzelnen Beispiel-Intent unterstützt:

  • Beispiele für Konfigurationsextras:
    • mime_type [String] Beispiel für einen Hinweis zum MIME-Typ. Zum Beispiel application/dash+xml für DASH-Inhalte.
    • clip_start_position_ms [Long] Ein Startpunkt, auf den die Stichprobe gekürzt werden soll, in Millisekunden.
    • clip_end_position_ms [Long] Ein Endpunkt in Millisekunden, ab dem die Stichprobe abgeschnitten werden soll.
    • drm_scheme [String] DRM-Schema, falls geschützt Gültige Werte sind widevine, playready und clearkey. UUIDs im DRM-Schema werden ebenfalls akzeptiert.
    • drm_license_uri [String] URI des Lizenzservers, falls geschützt.
    • drm_force_default_license_uri [Boolesch] Gibt an, ob die Verwendung von drm_license_uri für Schlüsselanfragen erzwungen werden soll, die einen eigenen Lizenz-URI enthalten.
    • drm_key_request_properties [Stringarray] Schlüsselanfrageheader, die als name1, value1, name2, value2 usw. verpackt sind, sofern geschützt.
    • drm_session_for_clear_content [Boolesch] Gibt an, ob eine DRM-Sitzung zum Löschen von Video- und Audiotracks angehängt wird.
    • drm_multi_session [Boolesch] Aktiviert die Schlüsselrotation, falls geschützt.
    • subtitle_uri [String] Der URI einer Sidecar-Untertiteldatei.
    • subtitle_mime_type [String] Der MIME-Typ von „subtitle_uri“ (erforderlich, wenn „subtitle_uri“ festgelegt ist).
    • subtitle_language [String] Der BCP47-Sprachcode der Untertiteldatei (wird ignoriert, wenn „subtitle_uri“ nicht festgelegt ist).
    • ad_tag_uri [String] Der URI eines Anzeigen-Tags, das mit der [IMA-Erweiterung][] geladen werden soll.
    • prefer_extension_decoders [Boolesch] Gibt an, ob Erweiterungsdecodierer den Plattform-Decodern vorgezogen werden.

Wenn Sie adb shell am start zum Auslösen eines Intents verwenden, kann mit --es ein optionaler String-Extra-String festgelegt werden (z.B. --es extension mpd). Ein optionales boolesches Extra kann mit --ez festgelegt werden (z.B. --ez prefer_extension_decoders TRUE). Ein optionales langes Zusatzelement kann mit --el festgelegt werden (z.B. --el clip_start_position_ms 5000). Ein zusätzliches optionales String-Array kann mit --esa festgelegt werden (z.B. --esa drm_key_request_properties name1,value1.

Legen Sie die Aktion des Intents auf androidx.media3.demo.main.action.VIEW_LIST fest, um eine Playlist mit Beispielen abzuspielen. Die Extras der Beispielkonfiguration sind dieselben wie für androidx.media3.demo.main.action.VIEW, bis auf zwei Unterschiede:

  • Die Schlüssel der Extras sollten einen Unterstrich und den 0-basierten Index des Beispiels als Suffix enthalten. Beispielsweise würde extension_0 auf den Stichprobentyp für die erste Stichprobe hinweisen. drm_scheme_1 würde das Schema für die digitale Rechteverwaltung für das zweite Sample festlegen.
  • Der URI des Beispiels wird mit dem Schlüssel uri_<sample-index> als Extra übergeben.

Andere Extras, die nicht von einer Stichprobe abhängig sind, ändern sich nicht. Sie können beispielsweise den folgenden Befehl im Terminal ausführen, um eine Playlist mit zwei Elementen abzuspielen und die Erweiterung des zweiten Elements zu überschreiben:

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