Récupérer des métadonnées

Pendant la lecture

Les métadonnées du contenu multimédia peuvent être récupérées de plusieurs manières pendant la lecture. La méthode la plus simple consiste à écouter l'événement Player.Listener#onMediaMetadataChanged. Vous obtiendrez ainsi un objet MediaMetadata à utiliser, qui comporte 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 pendant la lecture). Si vous avez besoin d'examiner des métadonnées statiques, vous pouvez 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

try {
  MetadataRetriever.Builder(context, mediaItem).build().use { metadataRetriever ->
    val trackGroups = metadataRetriever.retrieveTrackGroups().await()
    val timeline = metadataRetriever.retrieveTimeline().await()
    val durationUs = metadataRetriever.retrieveDurationUs().await()
    handleMetadata(trackGroups, timeline, durationUs)
  }
} catch (e: IOException) {
  handleFailure(e)
}

Java

try (MetadataRetriever metadataRetriever =
    new MetadataRetriever.Builder(context, mediaItem).build()) {
  ListenableFuture<TrackGroupArray> trackGroupsFuture = metadataRetriever.retrieveTrackGroups();
  ListenableFuture<Timeline> timelineFuture = metadataRetriever.retrieveTimeline();
  ListenableFuture<Long> durationUsFuture = metadataRetriever.retrieveDurationUs();
  ListenableFuture<List<Object>> allFutures =
      Futures.allAsList(trackGroupsFuture, timelineFuture, durationUsFuture);
  Futures.addCallback(
      allFutures,
      new FutureCallback<List<Object>>() {
        @Override
        public void onSuccess(List<Object> result) {
          handleMetadata(
              Futures.getUnchecked(trackGroupsFuture),
              Futures.getUnchecked(timelineFuture),
              Futures.getUnchecked(durationUsFuture));
        }

        @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.

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