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
suspend fun retrievingMetadataRetrieveMetadataWithoutPlayback( context: Context, mediaItem: MediaItem, ) { 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 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); } } }