Application de démonstration ExoPlayer

L'application de démonstration principale d'ExoPlayer a deux objectifs principaux:

  1. Pour fournir un exemple relativement simple, mais complet, d'utilisation d'ExoPlayer. L'application de démonstration peut être un bon point de départ pour développer votre propre application.
  2. Pour essayer ExoPlayer facilement. L'application de démonstration peut être utilisée pour tester la lecture. de votre propre contenu en plus des exemples inclus.

Cette page explique comment obtenir, compiler et exécuter l'application de démonstration. Elle décrit également comment l'utiliser pour lire vos propres contenus multimédias.

Obtenir le code

Le code source de l'application de démonstration principale se trouve dans le dossier demos/main de notre projet GitHub. Si vous ne l'avez pas déjà fait, clonez le projet dans un répertoire local:

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

Ensuite, ouvrez le projet dans Android Studio. Vous devriez obtenir le résultat suivant Vue Projet Android (les dossiers appropriés de l'application de démonstration ont été développés):

Le projet dans Android Studio

Compiler et exécuter

Pour compiler et exécuter l'application de démonstration, sélectionnez et exécutez la configuration demo dans Android Studio L'application de démonstration sera installée et exécutée sur un appareil Android connecté. Nous vous recommandons d'utiliser un appareil physique si possible. Si vous souhaitez utiliser un émulateur consultez plutôt la section sur les émulateurs de la page Appareils compatibles et assurez-vous que votre appareil virtuel utilise une image système avec un niveau d'API d'au moins 23.

SampleChooserActivity et PlayerActivity

L'application de démonstration présente une liste d'exemples (SampleChooserActivity). Sélection... un Sample ouvre une deuxième activité (PlayerActivity) pour la lecture. La version de démonstration propose des commandes de lecture et une fonctionnalité de sélection de pistes. Elle utilise également La classe utilitaire EventLogger d'ExoPlayer pour générer des informations de débogage utiles le journal système. Vous pouvez consulter cette journalisation (ainsi que la journalisation des niveaux d'erreur pour autres balises) à l'aide de la commande suivante:

adb logcat EventLogger:V *:E

Activer les décodeurs groupés

ExoPlayer dispose d'un certain nombre d'extensions qui permettent d'utiliser des logiciels groupés y compris les décodeurs AV1, VP9, Opus, FLAC et FFmpeg (audio uniquement). Application de démonstration vous pouvez inclure et utiliser ces extensions, comme suit:

  1. Créez chacune des extensions que vous souhaitez inclure. Notez qu'il s'agit d'un un processus manuel. Reportez-vous au fichier README.md de chaque extension pour obtenir instructions.
  2. Dans la vue "Build Variants" (Variantes de compilation) d'Android Studio, définissez la variante de compilation pour la démonstration. module vers withDecoderExtensionsDebug ou withDecoderExtensionsRelease en tant que comme illustré dans l'image suivante.

    Sélectionner la variante de compilation de démonstration "withDecoderExtensionsDebug"

  3. Compilez, installez et exécutez la configuration demo normalement.

Par défaut, un décodeur d'extension ne sera utilisé que si un décodeur de plate-forme adapté n'existe pas. Il est possible de spécifier que les décodeurs d'extension doivent être de préférence, comme décrit dans les sections suivantes.

Lire votre propre contenu

Il existe plusieurs façons de lire votre propre contenu dans l'application de démonstration.

1. Modifier assets/media.exolist.json

Les exemples listés dans l'application de démonstration sont chargés depuis assets/media.exolist.json. En modifiant ce fichier JSON, vous pouvez ajouter et supprimer des échantillons dans la démonstration l'application. Le schéma est le suivant, où [O] indique un attribut facultatif.

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

Les playlists d'exemples peuvent être spécifiées à l'aide du schéma:

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

Si nécessaire, les en-têtes de requête de clé sont spécifiés en tant qu'objet contenant une chaîne pour chaque en-tête:

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

Dans l'exemple d'activité du sélecteur, le menu à développer contient des options pour spécifiant si les décodeurs d'extension doivent être privilégiés.

URI de fichiers locaux et restrictions d'espace de stockage cloisonné

Lorsque vous spécifiez des URI de fichiers locaux, l'application de démonstration demande l'espace de stockage nécessaire des autorisations d’accès pour lire ces fichiers. Cependant, Android 13 n'est pas Possibilité de charger des fichiers arbitraires qui ne se terminent pas par un fichier multimédia classique (.mp4, par exemple). Si vous devez charger un tel fichier, vous pouvez le placer dans le répertoire de stockage spécifique de l'application de démonstration qui ne présente aucune restriction d'accès. Ce se trouve généralement ici : /sdcard/Android/data/androidx.media3.demo.main/files.

2. Charger un fichier exolist.json externe

L'application de démonstration peut charger des fichiers JSON externes à l'aide du schéma ci-dessus et nommé conformément à la convention *.exolist.json. Par exemple, si vous hébergez un tel à l'emplacement https://yourdomain.com/samples.exolist.json, vous pouvez l'ouvrir dans le application de démonstration à l'aide de:

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

cliquer sur un lien *.exolist.json (par exemple, dans le navigateur ou dans un e-mail) ; client) sur un appareil sur lequel l'application de démonstration est installée, celle-ci s'ouvre également dans la démo. l'application. L'hébergement d'un fichier JSON *.exolist.json offre donc un moyen simple en distribuant du contenu pour que d'autres personnes l'essaient dans l'application de démonstration.

3. Déclencher un intent

Les intents peuvent être utilisés pour contourner la liste des échantillons et lancer directement lecture. Pour lire un seul Sample, définissez l'action de l'intent sur androidx.media3.demo.main.action.VIEW et son URI de données à celui de la d'un extrait à écouter. Un tel intent peut être déclenché depuis le terminal à l'aide de la commande suivante:

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

Les extras facultatifs compatibles avec un seul exemple d'intent sont les suivants:

  • Exemples d'extras de configuration: <ph type="x-smartling-placeholder">
      </ph>
    • mime_type [Chaîne] Exemple d'indication concernant le type MIME. Exemple : application/dash+xml pour le contenu DASH.
    • clip_start_position_ms [Long] Point de départ de l'échantillon sont tronquées, en quelques millisecondes.
    • clip_end_position_ms [Long] Point final à partir duquel l'échantillon doit être sont tronquées, en quelques millisecondes.
    • drm_scheme [Chaîne] Schéma DRM s'il est protégé. Les valeurs valides sont widevine, playready et clearkey. Les UUID du schéma DRM sont également acceptés.
    • drm_license_uri [Chaîne] URI du serveur de licences s'il est protégé.
    • drm_force_default_license_uri [Booléen] Indique s'il faut forcer l'utilisation de drm_license_uri pour les demandes de clés incluant leur propre URI de licence
    • drm_key_request_properties [Tableau de chaînes] En-têtes de requêtes de clé empaquetés sous la forme nom1, valeur1, nom2, valeur2, etc. s'ils sont protégés.
    • drm_session_for_clear_content [Booléen] Indique s'il faut associer une session DRM pour effacer les pistes audio et vidéo.
    • drm_multi_session [Booléen] Active la rotation des clés si elle est protégée.
    • subtitle_uri [String] URI d'un fichier side-car de sous-titres.
    • subtitle_mime_type [Chaîne] Type MIME de subtitle_uri (obligatoire si subtitle_uri est défini).
    • subtitle_language [String] Code de langue BCP47 du fichier de sous-titres (ignoré si subtitle_uri n'est pas défini).
    • ad_tag_uri [String] URI d'un tag d'emplacement publicitaire à charger à l'aide de la classe [Extension IMA][].
    • prefer_extension_decoders [Booléen] Indique si les décodeurs d'extension sont à ceux de la plate-forme.

Lorsque vous utilisez adb shell am start pour déclencher un intent, une chaîne supplémentaire facultative peut doit être défini sur --es (par exemple, --es extension mpd). Un extra booléen facultatif peut doit être défini sur --ez (par exemple, --ez prefer_extension_decoders TRUE). Une option Le complément long peut être défini avec --el (par exemple, --el clip_start_position_ms 5000). Une L'extra facultatif du tableau de chaînes peut être défini avec --esa (par exemple, --esa drm_key_request_properties name1,value1).

Pour lire une playlist de samples, définissez l'action de l'intent sur androidx.media3.demo.main.action.VIEW_LIST Exemple de configuration les extras restent les mêmes que pour androidx.media3.demo.main.action.VIEW, à l'exception de deux différences:

  • Les extras les clés doivent comporter un trait de soulignement et l'index en base 0 de l'échantillon en tant que suffixe. Par exemple, extension_0 indique le type d'échantillon pour la première échantillon. drm_scheme_1 définit le schéma DRM pour le deuxième échantillon.
  • L'URI de l'échantillon est transmis en tant qu'élément supplémentaire avec la clé uri_<sample-index>.

Les autres extras, qui ne dépendent pas de l'échantillon, ne sont pas modifiés. Par exemple : Vous pouvez exécuter la commande suivante dans le terminal pour lire une playlist avec deux éléments, en remplaçant l'extension du deuxième élément:

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