Mengambil metadata

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

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

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);
    }
  }
}