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 .

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