Metadaten abrufen

Während der Wiedergabe

Die Metadaten der Medien können während der Wiedergabe auf verschiedene Arten abgerufen werden. Die ist es am einfachsten, auf das Ereignis Player.Listener#onMediaMetadataChanged-Ereignis; erhalten Sie eine MediaMetadata-Objekt, das Felder wie title und albumArtist 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üssen, kann über die TrackSelections#getFormat aufgerufen werden. Player#getMediaMetadata wird aus diesen beiden Quellen ausgefüllt.

Ohne Wiedergabe

Wenn keine Wiedergabe erforderlich ist, ist es effizienter, die MetadataRetriever, um die Metadaten zu extrahieren, weil so Erstellen und Vorbereiten eines Players.

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 Offsets und Länge 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);
    }
  }
}