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 escuchar el evento Player.Listener#onMediaMetadataChanged. Esto proporcionará un objeto MediaMetadata para usar, que tiene campos como title y albumArtist. Como alternativa, si se llama a Player#getMediaMetadata, se muestra el mismo objeto.

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 entregados durante la reproducción). Como alternativa, si es necesario observar metadatos estáticos, se puede acceder a ellos a través de TrackSelections#getFormat. Player#getMediaMetadata se propaga desde ambas 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 los metadatos de una foto en movimiento, que contiene, por ejemplo, el desplazamiento y la longitud de la imagen y el video. Se admiten los siguientes formatos:

  • Fotos en movimiento JPEG grabadas por las apps de cámara de Google Pixel y Samsung ExoPlayer puede reproducir este formato y, por lo tanto, los metadatos asociados se pueden recuperar con un reproductor o con MetadataRetriever.
  • Fotos en movimiento HEIC grabadas por las apps de cámara de Google Pixel y Samsung Actualmente, ExoPlayer no puede reproducir este formato y, por lo tanto, los metadatos asociados deben recuperarse mediante MetadataRetriever.

Para las fotos en movimiento, el TrackGroupArray obtenido con MetadataRetriever contiene un TrackGroup con un solo Format que contiene 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);
    }
  }
}