Selama pemutaran
Metadata media ini dapat diambil selama pemutaran dengan berbagai cara. Tujuan
yang paling mudah adalah mendengarkan
Player.Listener#onMediaMetadataChanged peristiwa; hal ini akan memberikan
Objek MediaMetadata untuk digunakan, yang memiliki kolom seperti title dan
albumArtist. Atau, memanggil Player#getMediaMetadata akan menampilkan hasil yang sama
.
Kotlin
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) { mediaMetadata.title?.let(::handleTitle) }
Java
@Override public void onMediaMetadataChanged(MediaMetadata mediaMetadata) { if (mediaMetadata.title != null) { handleTitle(mediaMetadata.title); } }
Jika aplikasi Anda memerlukan akses ke objek Metadata.Entry tertentu, akses tersebut
harus memproses Player.Listener#onMetadata (untuk metadata dinamis yang dikirim
selama pemutaran). Atau, jika ada kebutuhan
untuk melihat {i>metadata<i} statis,
alamat ini dapat diakses melalui TrackSelections#getFormat.
Player#getMediaMetadata diisi dari kedua sumber ini.
Tanpa pemutaran
Jika pemutaran tidak diperlukan, akan lebih efisien untuk menggunakan
MetadataRetriever untuk mengekstrak metadata karena menghindari keharusan
membuat dan mempersiapkan pemain.
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); }
Foto motion
Hal ini juga memungkinkan untuk mengekstrak {i>metadata <i} foto bergerak, termasuk offset dan panjang bagian gambar dan video dari file.
Untuk foto motion, TrackGroupArray yang diperoleh dengan MetadataRetriever
berisi TrackGroup dengan satu Format yang menyertakan
Entri metadata MotionPhotoMetadata.
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); } } }