প্লেব্যাক চলাকালীন
মিডিয়ার মেটাডেটা একাধিক উপায়ে প্লেব্যাকের সময় পুনরুদ্ধার করা যেতে পারে। সবচেয়ে সোজা হল 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); } } }