Während der Wiedergabe
Die Metadaten der Medien können während der Wiedergabe auf verschiedene Arten abgerufen werden. Die
ist es am einfachsten,
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
einen Player erstellen und vorbereiten.
Kotlin
suspend fun retrievingMetadataRetrieveMetadataWithoutPlayback( context: Context, mediaItem: MediaItem, ) { try { MetadataRetriever.Builder(context, mediaItem).build().use { metadataRetriever -> val trackGroups = metadataRetriever.retrieveTrackGroups().await() val timeline = metadataRetriever.retrieveTimeline().await() val durationUs = metadataRetriever.retrieveDurationUs().await() handleMetadata(trackGroups, timeline, durationUs) } } catch (e: IOException) { handleFailure(e) } }
Java
try (MetadataRetriever metadataRetriever = new MetadataRetriever.Builder(context, mediaItem).build()) { ListenableFuture<TrackGroupArray> trackGroupsFuture = metadataRetriever.retrieveTrackGroups(); ListenableFuture<Timeline> timelineFuture = metadataRetriever.retrieveTimeline(); ListenableFuture<Long> durationUsFuture = metadataRetriever.retrieveDurationUs(); ListenableFuture<List<Object>> allFutures = Futures.allAsList(trackGroupsFuture, timelineFuture, durationUsFuture); Futures.addCallback( allFutures, new FutureCallback<List<Object>>() { @Override public void onSuccess(List<Object> result) { handleMetadata( Futures.getUnchecked(trackGroupsFuture), Futures.getUnchecked(timelineFuture), Futures.getUnchecked(durationUsFuture)); } @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); } } }