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, kullanılacak bir MediaMetadata nesnesi sağlar. Bu nesnede title ve albumArtist gibi alanlar bulunur. Alternatif olarak, Player#getMediaMetadata işlevini çağırmak 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 sunulan dinamik meta veriler için). Alternatif olarak, statik meta verilere bakılması gerekiyorsa bu verilere TrackSelections#getFormat üzerinden erişilebilir. Player#getMediaMetadata, bu kaynakların her ikisinden de doldurulur.

Oynatma olmadan

Oynatma gerekmiyorsa oynatıcı oluşturup hazırlamayı gerektirmediği için meta verileri ayıklamak üzere MetadataRetriever simgesini kullanmak daha verimlidir.

Kotlin

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

Hareketli fotoğraflar

Dosyanın görüntü ve video bölümlerinin uzunlukları ve ofsetleri de dahil olmak üzere hareketli fotoğraf meta verilerini de ayıklayabilirsiniz.

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