Selama pemutaran
Metadata media ini dapat diambil selama pemutaran dengan berbagai cara. Cara
yang paling mudah adalah memproses
peristiwa Player.Listener#onMediaMetadataChanged
; tindakan ini akan menyediakan
objek MediaMetadata
untuk digunakan, yang memiliki kolom seperti title
dan
albumArtist
. Atau, memanggil Player#getMediaMetadata
akan menampilkan objek
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, aplikasi 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
guna mengekstrak metadata karena tidak perlu
membuat dan menyiapkan pemutar.
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);
Foto motion
Anda juga dapat mengekstrak metadata foto gerakan, termasuk offset dan panjang bagian gambar dan video dari file.
Untuk foto gerakan, TrackGroupArray
yang diperoleh dengan MetadataRetriever
berisi TrackGroup
dengan satu Format
yang melampirkan
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); } } }