Mengambil metadata

Selama pemutaran

Metadata media dapat diambil selama pemutaran dengan beberapa cara. Yang paling mudah adalah memproses peristiwa Player.Listener#onMediaMetadataChanged; cara ini akan memberikan 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 harus memproses Player.Listener#onMetadata (untuk metadata dinamis yang dikirim selama pemutaran). Atau, jika perlu melihat metadata statis, metadata dapat diakses melalui TrackSelections#getFormat. Player#getMediaMetadata diisi dari kedua sumber ini.

Tanpa pemutaran

Jika pemutaran tidak diperlukan, akan lebih efisien menggunakan MetadataRetriever untuk mengekstrak metadata karena Anda 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 motion, yang berisi offset dan panjang gambar dan video, misalnya. Format berikut ini didukung:

  • Foto motion JPEG yang direkam oleh aplikasi kamera Google Pixel dan Samsung. Format ini dapat diputar oleh ExoPlayer, dan metadata terkait karenanya dapat diambil dengan pemutar atau menggunakan MetadataRetriever.
  • Foto motion HEIC yang direkam oleh aplikasi kamera Google Pixel dan Samsung. Format ini saat ini tidak dapat diputar oleh ExoPlayer, dan metadata terkait oleh karena itu harus diambil menggunakan MetadataRetriever.

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