Recupero dei metadati

Durante la riproduzione

I metadati dei contenuti multimediali possono essere recuperati durante la riproduzione in diversi modi. Il più semplice consiste nell'ascoltare l'evento Player.Listener#onMediaMetadataChanged; in questo modo sarà possibile utilizzare un oggetto MediaMetadata con campi come title e albumArtist. In alternativa, la chiamata a Player#getMediaMetadata restituisce lo stesso oggetto.

Kotlin

override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata.title?.let(::handleTitle)
}

Java

@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
  if (mediaMetadata.title != null) {
    handleTitle(mediaMetadata.title);
  }
}

Se la tua app ha bisogno di accedere a oggetti Metadata.Entry specifici, deve ascoltare Player.Listener#onMetadata (per i metadati dinamici inviati durante la riproduzione). In alternativa, se è necessario esaminare i metadati statici, è possibile accedervi tramite TrackSelections#getFormat. Il campo Player#getMediaMetadata viene compilato da entrambe le origini.

Senza riproduzione

Se la riproduzione non è necessaria, è più efficiente utilizzare l'elemento MetadataRetriever per estrarre i metadati, in quanto evita di dover creare e preparare un player.

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

Foto in movimento

È anche possibile estrarre i metadati delle foto in movimento, compresi gli offset e la lunghezza delle parti di immagini e video presenti nel file. Sono supportati i seguenti formati di contenitore per le foto in movimento:

  • Foto in movimento in formato JPEG registrate da alcune app fotocamera Android. La parte video di questi file può essere riprodotta da ExoPlayer. Anche i metadati associati vengono esposti dal player e possono essere recuperati utilizzando MetadataRetriever.
  • Foto in movimento in formato HEIC registrate da alcune app fotocamera Android. La parte video di questi file non può essere riprodotta da ExoPlayer, ma i metadati associati possono essere recuperati utilizzando MetadataRetriever.

Per le foto in movimento, il TrackGroupArray ottenuto con MetadataRetriever contiene un TrackGroup con un singolo Format che include una voce di metadati 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);
    }
  }
}