Cómo recuperar metadatos

Durante la reproducción

Los metadatos del contenido multimedia se pueden recuperar durante la reproducción de varias maneras. Lo más sencillo es detectar el evento Player.Listener#onMediaMetadataChanged, que proporcionará un objeto MediaMetadata para usar, que tiene campos como title y albumArtist. Como alternativa, si llamas a Player#getMediaMetadata, se muestra lo mismo .

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

Si tu app necesita acceso a objetos Metadata.Entry específicos, debe escuchar Player.Listener#onMetadata (para metadatos dinámicos que se entregan durante la reproducción). Como alternativa, si necesitas consultar metadatos estáticos, puedes acceder a ellos a través de TrackSelections#getFormat. Player#getMediaMetadata se propaga a partir de estas dos fuentes.

Sin reproducción

Si no se necesita la reproducción, es más eficiente usar MetadataRetriever para extraer los metadatos, ya que evita tener que crear y preparar un reproductor.

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

Fotos en movimiento

También es posible extraer metadatos de fotos en movimiento, incluidos los desplazamientos y las duraciones de las partes de imagen y video del archivo.

En el caso de las fotos en movimiento, el TrackGroupArray obtenido con el MetadataRetriever contiene un TrackGroup con un solo Format que encierra una entrada de metadatos MotionPhotoMetadata.

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