वीडियो चलाने के दौरान
मीडिया चलाते समय, उसके मेटाडेटा को कई तरीकों से वापस पाया जा सकता है. सबसे आसान तरीका यह है कि 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
निकालें, क्योंकि इससे मेटाडेटा को
खिलाड़ी बनाना और तैयार करना.
val trackGroupsFuture = MetadataRetriever.retrieveMetadata(context, mediaItem)
Futures.addCallback(
trackGroupsFuture,
object : FutureCallback<TrackGroupArray?> {
override fun onSuccess(trackGroups: TrackGroupArray?) {
if (trackGroups != null) handleMetadata(trackGroups)
}
override fun onFailure(t: Throwable) {
handleFailure(t)
}
},
executor
)
ListenableFuture<TrackGroupArray> trackGroupsFuture =
MetadataRetriever.retrieveMetadata(context, mediaItem);
Futures.addCallback(
trackGroupsFuture,
new FutureCallback<TrackGroupArray>() {
@Override
public void onSuccess(TrackGroupArray trackGroups) {
handleMetadata(trackGroups);
}
@Override
public void onFailure(Throwable t) {
handleFailure(t);
}
},
executor);
मोशन फ़ोटो
मोशन फ़ोटो का मेटाडेटा निकाला जा सकता है. इसमें ऑफ़सेट और फ़ाइल की इमेज और वीडियो वाले हिस्सों की लंबाई.
मोशन फ़ोटो के लिए, MetadataRetriever
के साथ मिले TrackGroupArray
में एक Format
के साथ TrackGroup
होता है. इसमें 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);
}
}
}