Metadaten abrufen

Während der Wiedergabe

Die Metadaten der Medien können während der Wiedergabe auf verschiedene Arten abgerufen werden. Am einfachsten ist es, auf das Player.Listener#onMediaMetadataChanged-Ereignis zu warten. Dadurch wird ein MediaMetadata-Objekt bereitgestellt, das Felder wie title und albumArtist enthält. Alternativ wird beim Aufrufen von Player#getMediaMetadata dasselbe Objekt zurückgegeben.

Kotlin

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

Java

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

Wenn Ihre App Zugriff auf bestimmte Metadata.Entry-Objekte benötigt, sollte sie Player.Listener#onMetadata überwachen (für dynamische Metadaten, die während der Wiedergabe bereitgestellt werden). Wenn statische Metadaten geprüft werden müssen, kann über TrackSelections#getFormat darauf zugegriffen werden. Player#getMediaMetadata wird aus beiden Quellen gefüllt.

Ohne Wiedergabe

Wenn keine Wiedergabe erforderlich ist, ist es effizienter, MetadataRetriever zum Extrahieren der Metadaten zu verwenden, da kein Player erstellt und vorbereitet werden muss.

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 mit Bewegtbild

Es ist auch möglich, die Metadaten eines Fotos mit Bewegtbild zu extrahieren, beispielsweise den Versatz und die Länge des Bilds und Videos. Folgende Formate werden unterstützt:

  • Bewegte JPEG-Fotos, die mit Google Pixel und Samsung-Kamera-Apps aufgenommen wurden. Dieses Format kann von ExoPlayer wiedergegeben werden. Die zugehörigen Metadaten können daher mit einem Player oder mithilfe der MetadataRetriever abgerufen werden.
  • HEIC-Bewegungsfotos, die mit Google Pixel- und Samsung-Kamera-Apps aufgenommen wurden. Dieses Format kann derzeit nicht von ExoPlayer wiedergegeben werden. Die zugehörigen Metadaten sollten daher mit MetadataRetriever abgerufen werden.

Bei Fotos mit Bewegtbild enthält der mit MetadataRetriever abgerufene TrackGroupArray ein TrackGroup mit einem einzelnen Format, der einen MotionPhotoMetadata-Metadateneintrag enthält.

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