Cómo recuperar metadatos

Durante la reproducción

Los metadatos del contenido multimedia se pueden recuperar durante la reproducción de varias maneras. El más sencillo es escuchar Player.Listener#onMediaMetadataChanged evento; esto 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 acceder a objetos Metadata.Entry específicos, debería escuchar Player.Listener#onMetadata (para los metadatos dinámicos publicados durante la reproducción). Por otro lado, si hay que analizar los metadatos estáticos, se puede acceder 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 a un jugador.

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 de las partes de imagen y video del archivo.

Para las fotos en movimiento, el TrackGroupArray obtenido con MetadataRetriever contiene una 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);
    }
  }
}