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 Ereignis Player.Listener#onMediaMetadataChanged zu warten. Dadurch wird ein MediaMetadata-Objekt mit Feldern wie title und albumArtist zur Verfügung gestellt. Wenn Sie Player#getMediaMetadata aufrufen, wird dasselbe Ergebnis -Objekt enthält.

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 Player.Listener#onMetadata überwachen (für übermittelte dynamische Metadaten während der Wiedergabe. Wenn Sie sich statische Metadaten ansehen möchten, können Sie diese über die TrackSelections#getFormat aufrufen. Player#getMediaMetadata wird aus diesen beiden Quellen ausgefüllt.

Ohne Wiedergabe

Wenn keine Wiedergabe erforderlich ist, ist es effizienter, die Metadaten mit MetadataRetriever zu extrahieren, 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, Metadaten von Fotos mit Bewegtbild zu extrahieren, einschließlich der Offset- und Längenwerte der Bild- und Videoteile der Datei.

Bei Fotos mit Bewegtbild die TrackGroupArray, die mit dem MetadataRetriever abgerufen wurden enthält eine TrackGroup mit einer einzelnen Format, die ein MotionPhotoMetadata-Metadateneintrag.

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