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

वीडियो चलाने के दौरान

वीडियो चलाने के दौरान, मीडिया का मेटाडेटा कई तरीकों से वापस लाया जा सकता है. कॉन्टेंट बनाने सबसे आसान तरीका है कि आप 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 retrievingMetadataRetrieveMetadataWithoutPlayback(
  context: Context,
  mediaItem: MediaItem,
) {
  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);
}

मोशन फ़ोटो

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

मोशन फ़ोटो के लिए, MetadataRetriever से मिला TrackGroupArray में एक 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);
    }
  }
}