Oynatma sırasında
Medyanın meta verileri, oynatma sırasında birden çok şekilde alınabilir. En basit yöntem, Player.Listener#onMediaMetadataChanged etkinliğini dinlemektir. Bu, kullanılacak bir MediaMetadata nesnesi sağlar. Bu nesnede title ve albumArtist gibi alanlar bulunur. Alternatif olarak, Player#getMediaMetadata işlevini çağırmak aynı nesneyi döndürür.
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 dinlemesi gerekir (oynatma sırasında sunulan dinamik meta veriler için). Alternatif olarak, statik meta verilere bakılması gerekiyorsa bu verilere TrackSelections#getFormat üzerinden erişilebilir.
Player#getMediaMetadata, bu kaynakların her ikisinden de doldurulur.
Oynatma olmadan
Oynatma gerekmiyorsa oynatıcı oluşturup hazırlamayı gerektirmediği için meta verileri ayıklamak üzere MetadataRetriever simgesini kullanmak daha verimlidir.
Kotlin
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
Dosyanın görüntü ve video bölümlerinin uzunlukları ve ofsetleri de dahil olmak üzere hareketli fotoğraf meta verilerini de ayıklayabilirsiniz.
Hareketli fotoğraflar için MetadataRetriever ile elde edilen TrackGroupArray, MotionPhotoMetadata meta veri girişini içeren tek bir Format ile çevrili bir TrackGroup içerir.
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); } } }