Récupérer des métadonnées

Pendant la lecture

Les métadonnées du contenu multimédia peuvent être récupérées pendant la lecture de différentes manières. La le plus simple est d'écouter Player.Listener#onMediaMetadataChanged événement ; vous obtenez objet MediaMetadata à utiliser, comportant des champs tels que title et albumArtist L'appel de Player#getMediaMetadata renvoie le même résultat .

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 transmises pendant la lecture). Sinon, s'il est nécessaire d'examiner les métadonnées statiques, celui-ci est accessible 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 la MetadataRetriever pour extraire les métadonnées, car cela évite d'avoir à pour 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 la longueur des parties image et vidéo du fichier.

Pour les photos animées, le TrackGroupArray obtenu avec l'MetadataRetriever contient un TrackGroup avec un seul Format entourant un 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);
    }
  }
}