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.

override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata
.title?.let(::handleTitle)
}
@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.

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

0.until(trackGroups.length)
 
.asSequence()
 
.mapNotNull { trackGroups[it].getFormat(0).metadata }
 
.filter { metadata -> metadata.length() == 1 }
 
.map { metadata -> metadata[0] }
 
.filterIsInstance<MotionPhotoMetadata>()
 
.forEach(::handleMotionPhotoMetadata)
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);
   
}
 
}
}