Recupero dei metadati

Durante la riproduzione

I metadati dei contenuti multimediali possono essere recuperati durante la riproduzione 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 a Player#getMediaMetadata restituisce lo stesso oggetto.

KotlinJava
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata
.title?.let(::handleTitle)
}
@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
 
if (mediaMetadata.title != null) {
    handleTitle
(mediaMetadata.title);
 
}
}

Se la tua app ha bisogno di accedere 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.

KotlinJava
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
)
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
);

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 il MetadataRetriever contiene un TrackGroup con un singolo Format che racchiude una voce di metadati MotionPhotoMetadata.

KotlinJava
0.until(trackGroups.length)
 
.asSequence()
 
.mapNotNull { trackGroups[it].getFormat(0).metadata }
 
.filter { metadata -> metadata.length() == 1 }
 
.map { metadata -> metadata[0] }
 
.filterIsInstance<MotionPhotoMetadata>()
 
.forEach(::handleMotionPhotoMetadata)
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);
   
}
 
}
}