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 d'une photo animée, contenant par exemple le décalage et la durée des images et des vidéos. Les formats suivants sont acceptés:
- Photos animées JPEG enregistrées par les applications Appareil photo du Google Pixel et de Samsung. Ce format peut être lu par ExoPlayer, et les métadonnées associées peuvent donc être récupérées avec un lecteur ou à l'aide de
MetadataRetriever
. - Photos animées HEIC enregistrées par les applications d'appareil photo Google Pixel et Samsung. Actuellement, ce format ne peut pas être lu par ExoPlayer. Les métadonnées associées doivent donc ê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); } } }