মেটাডেটা পুনরুদ্ধার করা হচ্ছে
সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
প্লেব্যাক চলাকালীন
মিডিয়ার মেটাডেটা একাধিক উপায়ে প্লেব্যাকের সময় পুনরুদ্ধার করা যেতে পারে। সবচেয়ে সোজা হল 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);
}
}
}
এই পৃষ্ঠার কন্টেন্ট ও কোডের নমুনাগুলি Content License-এ বর্ণিত লাইসেন্সের অধীনস্থ। Java এবং OpenJDK হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2025-08-01 UTC-তে শেষবার আপডেট করা হয়েছে।
[[["সহজে বোঝা যায়","easyToUnderstand","thumb-up"],["আমার সমস্যার সমাধান হয়েছে","solvedMyProblem","thumb-up"],["অন্যান্য","otherUp","thumb-up"]],[["এতে আমার প্রয়োজনীয় তথ্য নেই","missingTheInformationINeed","thumb-down"],["খুব জটিল / অনেক ধাপ","tooComplicatedTooManySteps","thumb-down"],["পুরনো","outOfDate","thumb-down"],["অনুবাদ সংক্রান্ত সমস্যা","translationIssue","thumb-down"],["নমুনা / কোড সংক্রান্ত সমস্যা","samplesCodeIssue","thumb-down"],["অন্যান্য","otherDown","thumb-down"]],["2025-08-01 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[],null,["# Retrieving metadata\n\nDuring playback\n---------------\n\nThe metadata of the media can be retrieved during playback in multiple ways. The\nmost straightforward is to listen for the\n`Player.Listener#onMediaMetadataChanged` event; this will provide a\n[`MediaMetadata`](/reference/androidx/media3/common/MediaMetadata) object for use, which has fields such as `title` and\n`albumArtist`. Alternatively, calling `Player#getMediaMetadata` returns the same\nobject. \n\n### Kotlin\n\n```kotlin\noverride fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {\n mediaMetadata.title?.let(::handleTitle)\n}\n```\n\n### Java\n\n```java\n@Override\npublic void onMediaMetadataChanged(MediaMetadata mediaMetadata) {\n if (mediaMetadata.title != null) {\n handleTitle(mediaMetadata.title);\n }\n}\n```\n\n\u003cbr /\u003e\n\nIf your app needs access to specific [`Metadata.Entry`](/reference/androidx/media3/common/Metadata.Entry) objects, then it\nshould listen to `Player.Listener#onMetadata` (for dynamic metadata delivered\nduring playback). Alternatively, if there is a need to look at static metadata,\nthis can be accessed through the `TrackSelections#getFormat`.\n`Player#getMediaMetadata` is populated from both of these sources.\n\nWithout playback\n----------------\n\nIf playback is not needed, it is more efficient to use the\n[`MetadataRetriever`](/reference/androidx/media3/exoplayer/MetadataRetriever) to extract the metadata because it avoids having to\ncreate and prepare a player. \n\n### Kotlin\n\n```kotlin\nsuspend fun retrievingMetadataRetrieveMetadataWithoutPlayback(\n context: Context,\n mediaItem: MediaItem,\n) {\n try {\n MetadataRetriever.Builder(context, mediaItem).build().use { metadataRetriever -\u003e\n val trackGroups = metadataRetriever.retrieveTrackGroups().await()\n val timeline = metadataRetriever.retrieveTimeline().await()\n val durationUs = metadataRetriever.retrieveDurationUs().await()\n handleMetadata(trackGroups, timeline, durationUs)\n }\n } catch (e: IOException) {\n handleFailure(e)\n }\n}\n```\n\n### Java\n\n```java\ntry (MetadataRetriever metadataRetriever =\n new MetadataRetriever.Builder(context, mediaItem).build()) {\n ListenableFuture\u003cTrackGroupArray\u003e trackGroupsFuture = metadataRetriever.retrieveTrackGroups();\n ListenableFuture\u003cTimeline\u003e timelineFuture = metadataRetriever.retrieveTimeline();\n ListenableFuture\u003cLong\u003e durationUsFuture = metadataRetriever.retrieveDurationUs();\n ListenableFuture\u003cList\u003cObject\u003e\u003e allFutures =\n Futures.allAsList(trackGroupsFuture, timelineFuture, durationUsFuture);\n Futures.addCallback(\n allFutures,\n new FutureCallback\u003cList\u003cObject\u003e\u003e() {\n @Override\n public void onSuccess(List\u003cObject\u003e result) {\n handleMetadata(\n Futures.getUnchecked(trackGroupsFuture),\n Futures.getUnchecked(timelineFuture),\n Futures.getUnchecked(durationUsFuture));\n }\n\n @Override\n public void onFailure(Throwable t) {\n handleFailure(t);\n }\n },\n executor);\n}\n```\n\n\u003cbr /\u003e\n\nMotion photos\n-------------\n\n| **Note:** For motion photo **playback** , see [Media Items](/media/media3/exoplayer/images#motion-photos) and for motion photo **format support** , see [Supported formats](/media/media3/exoplayer/supported-formats#images).\n\nIt is also possible to extract motion photo metadata, including the offsets and\nlengths of the image and video parts of the file.\n\nFor motion photos, the `TrackGroupArray` obtained with the `MetadataRetriever`\ncontains a `TrackGroup` with a single `Format` enclosing a\n[`MotionPhotoMetadata`](/reference/androidx/media3/extractor/metadata/mp4/MotionPhotoMetadata) metadata entry. \n\n### Kotlin\n\n```kotlin\n0.until(trackGroups.length)\n .asSequence()\n .mapNotNull { trackGroups[it].getFormat(0).metadata }\n .filter { metadata -\u003e metadata.length() == 1 }\n .map { metadata -\u003e metadata[0] }\n .filterIsInstance\u003cMotionPhotoMetadata\u003e()\n .forEach(::handleMotionPhotoMetadata)\n```\n\n### Java\n\n```java\nfor (int i = 0; i \u003c trackGroups.length; i++) {\n TrackGroup trackGroup = trackGroups.get(i);\n Metadata metadata = trackGroup.getFormat(0).metadata;\n if (metadata != null && metadata.length() == 1) {\n Metadata.Entry metadataEntry = metadata.get(0);\n if (metadataEntry instanceof MotionPhotoMetadata) {\n MotionPhotoMetadata motionPhotoMetadata = (MotionPhotoMetadata) metadataEntry;\n handleMotionPhotoMetadata(motionPhotoMetadata);\n }\n }\n}\n```\n\n\u003cbr /\u003e"]]