প্লেব্যাকের সময়
প্লেব্যাকের সময় মিডিয়ার মেটাডেটা একাধিক উপায়ে পুনরুদ্ধার করা যেতে পারে। সবচেয়ে সহজ উপায় হল 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 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) } }
জাভা
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()); } }
মোশন ফটো
ফাইলের ছবি এবং ভিডিও অংশের অফসেট এবং দৈর্ঘ্য সহ মোশন ফটো মেটাডেটা বের করাও সম্ভব।
মোশন ছবির জন্য, MetadataRetriever দিয়ে প্রাপ্ত TrackGroupArray একটি TrackGroup থাকে যার একটি একক Format থাকে এবং একটি MotionPhotoMetadata মেটাডেটা এন্ট্রি সংযুক্ত থাকে।
কোটলিন
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); } } }