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
.
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 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.
Kotlin
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 )
Java
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
.
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); } } }