मेटाडेटा फिर से पाएं

MetadataRetriever, MediaItem से जानकारी (जैसे कि अवधि, वीडियो रिज़ॉल्यूशन, कोडेक, उपलब्ध ट्रैक, और सैंपलिंग रेट) को बिना प्लेबैक के वापस लाता है.

इसके सामान्य इस्तेमाल के उदाहरणों में ये शामिल हैं:

  • मोशन फ़ोटो का मेटाडेटा वापस पाना: इसमें फ़ाइल के इमेज और वीडियो वाले हिस्सों के ऑफ़सेट और लंबाई शामिल हैं.
  • मीडिया लाइब्रेरी बनाना: MediaLibraryService में MediaItem जैसी ज़्यादा जानकारी (जैसे कि अवधि और टाइटल) जोड़ना, ताकि Android Auto जैसे क्लाइंट को पूरा मीडिया कैटलॉग दिखाया जा सके.
  • यूज़र इंटरफ़ेस (यूआई) की जानकारी को पहले से फ़ेच करना: वीडियो चलाने से पहले यूज़र इंटरफ़ेस (यूआई) को तैयार करने के लिए, वीडियो के रिज़ॉल्यूशन या अवधि जैसी जानकारी फ़ेच करना.
  • मीडिया फ़ाइलों की पुष्टि करना: किसी फ़ाइल को प्रोसेस करने से पहले, यह देखना कि उसमें ज़रूरी ऑडियो या वीडियो ट्रैक या खास मेटाडेटा मौजूद है या नहीं.

खास जानकारी

MetadataRetriever का इस्तेमाल करने के लिए, यह तरीका अपनाएं:

  1. डेटा वापस पाने की सुविधा बनाना: MetadataRetriever.Builder का इस्तेमाल करके एक इंस्टेंस बनाएं. बिल्डर को Context और वह MediaItem पास करें जिसकी आपको जांच करनी है. कस्टम नेटवर्किंग या कैश मेमोरी जैसी बेहतर सुविधाओं के लिए, कस्टम MediaSource.Factory भी दिया जा सकता है.
  2. मेटाडेटा वापस पाना: ज़रूरी जानकारी पाने के लिए, retrieveDurationUs(), retrieveTimeline() या retrieveTrackGroups() जैसे तरीकों का इस्तेमाल करें. ये तरीके एसिंक्रोनस होते हैं. ये ListenableFuture दिखाते हैं, ताकि नेटवर्क या I/O कार्रवाइयां मुख्य थ्रेड को ब्लॉक न करें.

Kotlin

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) {
        throw RuntimeException(e)
    }
}

Java

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<>() {
            @Override
            public void onSuccess(List<Object> result) {
                handleMetadata(
                        Futures.getUnchecked(trackGroupsFuture),
                        Futures.getUnchecked(timelineFuture),
                        Futures.getUnchecked(durationUsFuture)
                );
            }

            @Override
            public void onFailure(@NonNull Throwable t) {
                handleFailure(t);
            }
        }, MoreExecutors.directExecutor());
    }
}