মেটাডেটা পুনরুদ্ধার করা হচ্ছে

প্লেব্যাক চলাকালীন

মিডিয়ার মেটাডেটা একাধিক উপায়ে প্লেব্যাকের সময় পুনরুদ্ধার করা যেতে পারে। সবচেয়ে সোজা হল Player.Listener#onMediaMetadataChanged ইভেন্ট; এটি ব্যবহারের জন্য একটি MediaMetadata অবজেক্ট প্রদান করবে, যার ক্ষেত্র রয়েছে যেমন title এবং albumArtist । বিকল্পভাবে, Player#getMediaMetadata কল করা একই বস্তু ফেরত দেয়।

কোটলিন

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

জাভা

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

আপনার অ্যাপের যদি নির্দিষ্ট Metadata.Entry অবজেক্টে অ্যাক্সেসের প্রয়োজন হয়, তাহলে এটি Player.Listener#onMetadata (প্লেব্যাকের সময় বিতরণ করা ডায়নামিক মেটাডেটার জন্য) শুনতে হবে। বিকল্পভাবে, স্ট্যাটিক মেটাডেটা দেখার প্রয়োজন হলে, এটি TrackSelections#getFormat এর মাধ্যমে অ্যাক্সেস করা যেতে পারে। Player#getMediaMetadata এই উভয় উৎস থেকে তৈরি করা হয়েছে।

প্লেব্যাক ছাড়া

প্লেব্যাকের প্রয়োজন না হলে, মেটাডেটা বের করার জন্য MetadataRetriever ব্যবহার করা আরও কার্যকর কারণ এটি একটি প্লেয়ার তৈরি এবং প্রস্তুত করা এড়িয়ে যায়।

কোটলিন

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

জাভা

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 MotionPhotoMetadata মেটাডেটা এন্ট্রির সাথে একটি একক Format সহ একটি TrackGroup রয়েছে।

কোটলিন

0.until(trackGroups.length)
  .asSequence()
  .mapNotNull { trackGroups[it].getFormat(0).metadata }
  .filter { metadata -> metadata.length() == 1 }
  .map { metadata -> metadata[0] }
  .filterIsInstance<MotionPhotoMetadata>()
  .forEach(::handleMotionPhotoMetadata)

জাভা

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