Récupérer des métadonnées

Pendant la lecture

Plusieurs possibilités s'offrent à vous pour récupérer les métadonnées du contenu multimédia pendant la lecture. Le plus simple consiste à écouter l'événement Player.Listener#onMediaMetadataChanged. Vous obtiendrez ainsi un objet MediaMetadata à utiliser, comportant des champs tels que title et albumArtist. Vous pouvez également appeler Player#getMediaMetadata pour renvoyer le même objet.

Kotlin

override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata.title?.let(::handleTitle)
}

Java

@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
  if (mediaMetadata.title != null) {
    handleTitle(mediaMetadata.title);
  }
}

Si votre application a besoin d'accéder à des objets Metadata.Entry spécifiques, elle doit écouter Player.Listener#onMetadata (pour les métadonnées dynamiques fournies lors de la lecture). Si vous devez examiner des métadonnées statiques, vous pouvez également y accéder via TrackSelections#getFormat. Player#getMediaMetadata est renseigné à partir de ces deux sources.

Sans lecture

Si la lecture n'est pas nécessaire, il est plus efficace d'utiliser MetadataRetriever pour extraire les métadonnées, car cela évite d'avoir à créer et préparer un lecteur.

Kotlin

val trackGroupsFuture = MetadataRetriever.retrieveMetadata(context, mediaItem)
Futures.addCallback(
  trackGroupsFuture,
  object : FutureCallback<TrackGroupArray?> {
    override fun onSuccess(trackGroups: TrackGroupArray?) {
      if (trackGroups != null) handleMetadata(trackGroups)
    }

    override fun onFailure(t: Throwable) {
      handleFailure(t)
    }
  },
  executor
)

Java

ListenableFuture<TrackGroupArray> trackGroupsFuture =
    MetadataRetriever.retrieveMetadata(context, mediaItem);
Futures.addCallback(
    trackGroupsFuture,
    new FutureCallback<TrackGroupArray>() {
      @Override
      public void onSuccess(TrackGroupArray trackGroups) {
        handleMetadata(trackGroups);
      }

      @Override
      public void onFailure(Throwable t) {
        handleFailure(t);
      }
    },
    executor);

Photos animées

Il est également possible d'extraire les métadonnées des photos animées, y compris les décalages et les longueurs des parties image et vidéo du fichier. Les formats de conteneur de photos animées suivants sont acceptés:

  • Photos animées JPEG enregistrées par certaines applications d'appareil photo Android. ExoPlayer peut lire la partie vidéo de ces fichiers. Les métadonnées associées sont également exposées par le lecteur et peuvent être récupérées à l'aide de MetadataRetriever.
  • Photos animées HEIC enregistrées par certaines applications d'appareil photo Android. ExoPlayer ne peut pas lire la partie vidéo de ces fichiers, mais les métadonnées associées peuvent être récupérées à l'aide de MetadataRetriever.

Pour les photos animées, le TrackGroupArray obtenu avec MetadataRetriever contient un TrackGroup avec un seul Format englobant une entrée de métadonnées MotionPhotoMetadata.

Kotlin

0.until(trackGroups.length)
  .asSequence()
  .mapNotNull { trackGroups[it].getFormat(0).metadata }
  .filter { metadata -> metadata.length() == 1 }
  .map { metadata -> metadata[0] }
  .filterIsInstance<MotionPhotoMetadata>()
  .forEach(::handleMotionPhotoMetadata)

Java

for (int i = 0; i < trackGroups.length; i++) {
  TrackGroup trackGroup = trackGroups.get(i);
  Metadata metadata = trackGroup.getFormat(0).metadata;
  if (metadata != null && metadata.length() == 1) {
    Metadata.Entry metadataEntry = metadata.get(0);
    if (metadataEntry instanceof MotionPhotoMetadata) {
      MotionPhotoMetadata motionPhotoMetadata = (MotionPhotoMetadata) metadataEntry;
      handleMotionPhotoMetadata(motionPhotoMetadata);
    }
  }
}