Meta verileri alma

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 işlem, title ve albumArtist gibi alanları olan bir MediaMetadata nesnesi sağlar. Alternatif olarak, Player#getMediaMetadata çağrısı da 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 gönderilen dinamik meta veriler için). Alternatif olarak, statik meta verilere bakmanız gerekiyorsa buna TrackSelections#getFormat üzerinden de erişilebilir. Player#getMediaMetadata bu kaynakların her ikisinden de doldurulur.

Oynatmadan

Oynatma gerekmiyorsa bir oynatıcı oluşturup hazırlamak zorunda kalmayacağınız için meta verileri çıkarmak için MetadataRetriever'ı kullanmak daha verimli olur.

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

Hareketli fotoğraflar

Örneğin, resim ile video ofseti ve uzunluğunu içeren bir hareketli fotoğrafın meta verilerini çıkarmak da mümkündür. Aşağıdaki biçimler desteklenir:

  • Google Pixel ve Samsung kamera uygulamaları tarafından kaydedilen JPEG hareketli fotoğraflar. Bu biçim ExoPlayer tarafından oynatılabilir ve ilişkili meta veriler, bir oynatıcıyla veya MetadataRetriever kullanılarak alınabilir.
  • Google Pixel ve Samsung kamera uygulamaları tarafından kaydedilen HEIC hareketli fotoğraflar. Bu biçim şu anda ExoPlayer tarafından oynatılamamaktadır ve ilişkili meta verilerin MetadataRetriever kullanılarak alınması gerekir.

Hareketli fotoğraflarda, MetadataRetriever ile elde edilen TrackGroupArray, MotionPhotoMetadata meta veri girişini içeren tek bir Format içeren 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);
    }
  }
}