ExoPlayer-Demoanwendung

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

  1. Um ein relativ einfaches Beispiel mit vollem Funktionsumfang für die ExoPlayer-Nutzung bereitzustellen. Die Demo-App kann als praktischer Ausgangspunkt für die Entwicklung für Ihre eigene App.
  2. Um den Test von ExoPlayer zu erleichtern. Mit der Demo-App kannst du die Wiedergabe testen eigenen Content zusätzlich zu den enthaltenen Beispielen.

Auf dieser Seite wird beschrieben, wie Sie die Demo-App abrufen, kompilieren und ausführen. Außerdem wird beschrieben, wie Sie damit Ihre eigenen Medien wiedergeben.

Code abrufen

Den Quellcode für die Haupt-Demo-App findest du im Ordner demos/main unter in unserem GitHub-Projekt. Falls noch nicht geschehen, klonen Sie das Projekt in einem lokales Verzeichnis:

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

Öffnen Sie als Nächstes das Projekt in Android Studio. In der Datei Android-Projektansicht (die relevanten Ordner der Demo-App wurden maximiert):

Das Projekt in Android Studio

Kompilieren und ausführen

Wählen Sie zum Kompilieren und Ausführen der Demo-App die Konfiguration demo aus und führen Sie sie aus in Android Studio Die Demo-App wird auf einem verbundenen Android-Gerät installiert und ausgeführt. Wir empfehlen, wenn möglich ein physisches Gerät zu verwenden. Wenn Sie einen Emulator verwenden möchten lies dir stattdessen den Abschnitt zu Emulatoren unter Unterstützte Geräte durch und achte darauf, Dein virtuelles Gerät verwendet ein System-Image mit einem API-Level von mindestens 23.

SampleChooserActivity und PlayerActivity

Die Demo-App enthält eine Liste von Beispielen (SampleChooserActivity). Wird ausgewählt Bei einem Sample wird eine zweite Aktivität (PlayerActivity) zur Wiedergabe geöffnet. Die Demo verfügt über Steuerelemente für die Wiedergabe und eine Funktion zur Titelauswahl. Außerdem werden Die Dienstprogrammklasse EventLogger von ExoPlayer, mit der nützliche Informationen zur Fehlerbehebung an das Systemprotokoll. Diese Protokollierung kann aufgerufen werden (zusammen mit der Protokollierung auf Fehlerebene für anderen Tags) mit dem Befehl:

adb logcat EventLogger:V *:E

Gebündelte Decoder aktivieren

ExoPlayer bietet eine Reihe von Erweiterungen, die die Verwendung von Software-Bundles ermöglichen Decoder, einschließlich AV1, VP9, Opus, FLAC und FFmpeg (nur Audio). Die Demo-App können so konzipiert werden, dass sie diese Erweiterungen einschließen und verwenden:

  1. Erstellen Sie alle Erweiterungen, die Sie einbinden möchten. Dies ist ein manueller Prozess. In der README.md-Datei in jeder Erweiterung finden Sie weitere Informationen. Anleitung.
  2. In der Ansicht „Build-Varianten“ von Android Studio die Build-Variante für die Demo festlegen Modul in withDecoderExtensionsDebug oder withDecoderExtensionsRelease als wie in der folgenden Abbildung dargestellt.

    Demo-Build-Variante „withDecoderExtensionsDebug“ auswählen

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

Standardmäßig wird nur dann ein Erweiterungsdecoder verwendet, wenn ein geeigneter Plattformdecoder verwendet wird. existiert nicht. Es kann festgelegt werden, dass Erweiterungsdecodierer zu bevorzugen, wie in den folgenden Abschnitten beschrieben.

Eigene Inhalte wiedergeben

Du hast mehrere Möglichkeiten, deine 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 Bearbeiten dieser JSON-Datei ist es möglich, Beispiele zur Demo hinzuzufügen oder daraus zu entfernen Das Schema lautet wie folgt, wobei [O] ein optionales Attribut angibt.

[
  {
    "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 mit Beispielen können mithilfe des 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
]

Bei Bedarf werden Schlüsselanfrageheader als Objekt angegeben, das einen String enthält. -Attribut für jede Überschrift ein:

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

In der Aktivität zur Beispielauswahl enthält das Dreipunkt-Menü Optionen für gibt an, ob Erweiterungsdecoder bevorzugt werden sollen.

Lokale Datei-URIs und beschränkte Speichereinschränkungen

Beim Angeben lokaler Datei-URIs fordert die Demo-App den erforderlichen Speicher an Zugriffsberechtigungen zum Lesen dieser Dateien. Ab Android 13 Es können beliebige Dateien geladen werden, die nicht zu einer typischen Mediendatei gehören. Erweiterung (z. B. .mp4). Wenn Sie eine solche Datei laden müssen, das spezifische Speicherverzeichnis der Demo-App, für das keine Zugriffsbeschränkungen gelten. Dieses befindet sich in der Regel hier: /sdcard/Android/data/androidx.media3.demo.main/files.

2. Externe exolist.json-Datei laden

Die Demo-App kann externe JSON-Dateien mit dem obigen Schema laden gemäß der *.exolist.json-Konvention. Wenn Sie zum Beispiel ein unter https://yourdomain.com/samples.exolist.json öffnen, können Sie sie im Demo-App mit:

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

Klicken auf einen *.exolist.json-Link (z. B. im Browser oder in einer E-Mail) -Client) auf einem Gerät, auf dem die Demo-App installiert ist, wird auch in der Demo geöffnet. Daher bietet das Hosten einer *.exolist.json-JSON-Datei eine einfache Möglichkeit, Inhalte in der Demo-App zu verteilen, damit andere diese testen können.

3. Intent auslösen

Intents können verwendet werden, um die Liste der Beispiele zu umgehen und direkt in Wiedergabe starten. Wenn Sie ein einzelnes Sample wiedergeben möchten, setzen Sie die Aktion des Intents auf androidx.media3.demo.main.action.VIEW und der zugehörige Daten-URI in Hörprobe zu starten. Ein solcher Intent kann mit folgendem Befehl vom Terminal ausgelöst werden:

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

Unterstützte optionale Extras für einen einzelnen Beispiel-Intent:

  • Beispiele für Konfigurationsextras: <ph type="x-smartling-placeholder">
      </ph>
    • mime_type [String] Beispiel für einen MIME-Typ-Hinweis. Beispiel: application/dash+xml für DASH-Inhalte.
    • clip_start_position_ms [Long] Ein Startpunkt, bis zu dem die Stichprobe erreicht werden soll in Millisekunden.
    • clip_end_position_ms [Long] Ein Endpunkt, von dem aus die Stichprobe entfernt werden soll in Millisekunden.
    • drm_scheme [String] DRM-Schema, sofern geschützt. Gültige Werte sind widevine, playready und clearkey. UUIDs für DRM-Schemas 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 erzwungen werden soll drm_license_uri für Schlüsselanfragen, die einen eigenen Lizenz-URI enthalten.
    • drm_key_request_properties [Stringarray] Schlüsselanfrageheader gepackt als Name1, Wert1, Name2, Wert2 usw., wenn geschützt.
    • drm_session_for_clear_content [Boolesch] Gibt an, ob eine DRM-Sitzung angehängt werden soll Video- und Audiotracks löschen.
    • drm_multi_session [Boolesch] Aktiviert die Schlüsselrotation, wenn sie geschützt ist.
    • subtitle_uri [String] Der URI einer Untertitel-Sidecar-Datei.
    • subtitle_mime_type [String] Der MIME-Typ von subtitle_uri (erforderlich bei 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][] an.
    • prefer_extension_decoders [Boolesch] Gibt an, ob Erweiterungsdecodierer sind bevorzugt werden.

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

Um eine Playlist mit Samples abzuspielen, setze die Intent-Aktion auf androidx.media3.demo.main.action.VIEW_LIST Die Beispielkonfiguration Extras bleiben dieselben wie für androidx.media3.demo.main.action.VIEW, mit Ausnahme von zwei Unterschieden:

  • Die Extras Schlüssel sollten einen Unterstrich und den 0-basierten Index der Stichprobe haben. als Suffix angeben. Beispiel: extension_0 gibt einen Hinweis auf den Stichprobentyp für den ersten Stichprobe. drm_scheme_1 legt das DRM-Schema für das zweite Beispiel fest.
  • Der URI des Beispiels wird als Extra mit dem Schlüssel uri_<sample-index> übergeben.

Andere Extras, die nicht von Stichproben abhängig sind, ändern sich nicht. Zum Beispiel haben Sie können Sie den folgenden Befehl im Terminal ausführen, um eine Playlist mit zwei Elementen abzuspielen: Überschreiben der Erweiterung des zweiten Elements:

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