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

suspend fun retrieveMetadata(context: Context, mediaItem: MediaItem) {
  try {
    // 1. Build the retriever.
    // `MetadataRetriever` implements `AutoCloseable`, so wrap it in
    // a Kotlin `.use` block, which calls `close()` automatically.
    MetadataRetriever.Builder(context, mediaItem).build().use { retriever ->
      // 2. Retrieve metadata asynchronously.
      val trackGroups = retriever.retrieveTrackGroups().await()
      val timeline = retriever.retrieveTimeline().await()
      val durationUs = retriever.retrieveDurationUs().await()
      handleMetadata(trackGroups, timeline, durationUs)
    }
  } catch (e: Exception) {
    handleFailure(e)
  }
}

Java

public void retrieveMetadata(Context context, MediaItem mediaItem) {
  // 1. Build the retriever.
  // `MetadataRetriever` implements `AutoCloseable`, so use try-with-resources
  // so that the resources are automatically released.
  try (MetadataRetriever retriever = new MetadataRetriever.Builder(context, mediaItem).build()) {
    // 2. Retrieve metadata asynchronously.
    ListenableFuture<TrackGroupArray> trackGroupsFuture = retriever.retrieveTrackGroups();
    ListenableFuture<Timeline> timelineFuture = retriever.retrieveTimeline();
    ListenableFuture<Long> durationUsFuture = retriever.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);
          }
        },
        directExecutor());
  }
}

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