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