Oynatma sırasında
Medyanın meta verileri, oynatma sırasında birkaç şekilde alınabilir. İlgili içeriği oluşturmak için kullanılan
en kolay seçenek olan
Player.Listener#onMediaMetadataChanged etkinlik; bu sorgu,
title ve gibi alanları içeren MediaMetadata nesnesi
albumArtist. Alternatif olarak, Player#getMediaMetadata işlevi çağrıldığında aynı
nesnesini tanımlayın.
Kotlin
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) { mediaMetadata.title?.let(::handleTitle) }
Java
@Override public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { if (mediaMetadata.title != null) { handleTitle(mediaMetadata.title); } }
Uygulamanızın belirli Metadata.Entry nesnelerine erişmesi gerekiyorsa
Player.Listener#onMetadata dinlemeli (yayınlanan dinamik meta veriler için)
oynatma sırasında). Alternatif olarak, statik meta verilere bakmanız gerekiyorsa
buna TrackSelections#getFormat üzerinden erişilebilir.
Player#getMediaMetadata, bu kaynakların her ikisinden de doldurulur.
Oynatmadan
Oynatma gerekmiyorsa
Meta verileri ayıklamak için MetadataRetriever
oyuncu oluşturup
hazırlayacağım.
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); }
Hareketli fotoğraflar
Ayrıca, ofsetler ve görüntüler gibi hareketli fotoğraf meta verilerini de dosyanın video bölümlerinin uzunluklarını etkilemez.
Hareketli fotoğraflar için, MetadataRetriever ile elde edilen TrackGroupArray
içeren tek bir Format içeren TrackGroup içerir
MotionPhotoMetadata meta veri girişi.
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); } } }