Durante la riproduzione
Durante la riproduzione è possibile recuperare i metadati dei contenuti multimediali in diversi modi. La
più semplice è ascoltare
Player.Listener#onMediaMetadataChanged evento; questo fornirà un
MediaMetadata da utilizzare, dotato di campi come title e
albumArtist, In alternativa, la chiamata di Player#getMediaMetadata restituisce lo stesso
.
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 richiede l'accesso a oggetti Metadata.Entry specifici,
deve ascoltare Player.Listener#onMetadata (per i metadati dinamici pubblicati
durante la riproduzione). In alternativa, se è necessario esaminare metadati statici,
è possibile accedervi tramite TrackSelections#getFormat.
Player#getMediaMetadata viene compilato da entrambe le origini.
Senza riproduzione
Se la riproduzione non è necessaria, è più efficiente utilizzare lo
MetadataRetriever per estrarre i metadati perché evita di doverli
per la creazione e la preparazione di un player.
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); }
Foto in movimento
È anche possibile estrarre i metadati delle foto in movimento, tra cui gli offset e delle parti immagine e video del file.
Per le foto in movimento, il valore di TrackGroupArray ottenuto con MetadataRetriever
contiene un elemento TrackGroup con un singolo Format che include un
Voce dei 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); } } }