मेटाडेटा फिर से लिया जा रहा है

प्लेबैक के दौरान

मीडिया के मेटाडेटा को चलाने के दौरान, कई तरीकों से वापस पाया जा सकता है. सबसे आसान तरीका यह है कि Player.Listener#onMediaMetadataChanged इवेंट को सुना जाए. इससे इस्तेमाल के लिए MediaMetadata ऑब्जेक्ट मिलेगा. इसमें title और albumArtist जैसे फ़ील्ड होते हैं. इसके अलावा, Player#getMediaMetadata को कॉल करने पर भी यही ऑब्जेक्ट मिलता है.

Kotlin

override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata.title?.let(::handleTitle)
}

Java

@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
  if (mediaMetadata.title != null) {
    handleTitle(mediaMetadata.title);
  }
}

अगर आपके ऐप्लिकेशन को किसी खास Metadata.Entry ऑब्जेक्ट को ऐक्सेस करने की ज़रूरत है, तो उसे Player.Listener#onMetadata को सुनना चाहिए. ऐसा इसलिए, ताकि वह वीडियो चलाने के दौरान डिलीवर किए गए डाइनैमिक मेटाडेटा को ऐक्सेस कर सके. इसके अलावा, अगर स्टैटिक मेटाडेटा देखने की ज़रूरत है, तो इसे TrackSelections#getFormat के ज़रिए ऐक्सेस किया जा सकता है. Player#getMediaMetadata इन दोनों सोर्स से मिलता है.

बिना प्लेबैक के

अगर वीडियो चलाने की ज़रूरत नहीं है, तो मेटाडेटा निकालने के लिए MetadataRetriever का इस्तेमाल करना ज़्यादा बेहतर है. ऐसा इसलिए, क्योंकि इससे प्लेयर बनाने और उसे तैयार करने की ज़रूरत नहीं पड़ती.

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

मोशन फ़ोटो

मोशन फ़ोटो का मेटाडेटा भी निकाला जा सकता है. इसमें फ़ाइल के इमेज और वीडियो वाले हिस्सों के ऑफ़सेट और लंबाई शामिल होती है.

मोशन फ़ोटो के लिए, TrackGroupArray को MetadataRetriever के साथ हासिल किया जाता है. इसमें एक TrackGroup होता है, जिसमें एक Format होता है. इसमें 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);
    }
  }
}