Durante la riproduzione
I metadati dei contenuti multimediali possono essere recuperati durante la riproduzione in diversi modi. Il modo
più semplice è ascoltare l'evento
Player.Listener#onMediaMetadataChanged, che fornirà un oggetto
MediaMetadata da utilizzare, con campi come title e
albumArtist. In alternativa, la chiamata di Player#getMediaMetadata restituisce lo stesso oggetto.
Kotlin
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) { mediaMetadata.title?.let(::handleTitle) }
Java
@Override public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { if (mediaMetadata.title != null) { handleTitle(mediaMetadata.title); } }
Se la tua app deve accedere a oggetti Metadata.Entry specifici, deve
ascoltare Player.Listener#onMetadata (per i metadati dinamici forniti
durante la riproduzione). In alternativa, se è necessario esaminare i metadati statici,
è possibile accedervi tramite TrackSelections#getFormat.
Player#getMediaMetadata viene compilato da entrambe queste fonti.
Senza riproduzione
Se la riproduzione non è necessaria, è più efficiente utilizzare
MetadataRetriever per estrarre i metadati, perché non è necessario
creare e preparare un player.
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); }
Foto in movimento
È anche possibile estrarre i metadati delle foto in movimento, inclusi gli offset e le lunghezze delle parti di immagine e video del file.
Per le foto in movimento, il TrackGroupArray ottenuto con MetadataRetriever
contiene un TrackGroup con un singolo Format che racchiude una
voce di metadati 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); } } }