वीडियो फ़्रेम एक्सट्रैक्ट करना

FrameExtractor क्लास, MediaItem से डिकोड किए गए फ़्रेम निकालने का एक असरदार तरीका उपलब्ध कराती है.

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

  • थंबनेल जनरेट करना: वीडियो गैलरी या सीक बार के लिए अच्छी क्वालिटी वाले थंबनेल बनाना.
  • वीडियो में बदलाव करने की झलक: एडिटर की टाइमलाइन में सटीक फ़्रेम की झलक दिखाना. इससे लोगों को कॉन्टेंट में बदलाव करने और फ़्रेम को सटीक तरीके से देखने में मदद मिलती है.
  • डेटा निकालने के दौरान, सीधे तौर पर स्केल करने, काटने या घुमाने जैसे बदलाव लागू करना. इससे, पोस्ट-प्रोसेसिंग के अलग चरण से बचा जा सकता है.
  • कॉन्टेंट का विश्लेषण करना: सीन का पता लगाने, ऑब्जेक्ट की पहचान करने या क्वालिटी कंट्रोल जैसे कामों के लिए, कुछ समय के अंतराल पर फ़्रेम निकालकर विश्लेषण पाइपलाइन को भेजना.

खास जानकारी

FrameExtractor का इस्तेमाल करने के लिए, आपको दो चरण पूरे करने होंगे:

  1. एक्सट्रैक्टर बनाना: FrameExtractor.Builder का इस्तेमाल करके एक इंस्टेंस बनाएं. बिल्डर को Context और वह MediaItem पास करें जिसकी आपको जांच करनी है. बेहतर सेटिंग के लिए, Builder पर कॉन्फ़िगरेशन के तरीकों को भी एक साथ इस्तेमाल किया जा सकता है.
  2. फ़्रेम एक्सट्रैक्ट करना: किसी खास टाइमस्टैंप पर फ़्रेम एक्सट्रैक्ट करने के लिए, getFrame() को कॉल करें या थंबनेल का अनुरोध करने के लिए, getThumbnail() को कॉल करें. ये तरीके एसिंक्रोनस होते हैं और ListenableFuture दिखाते हैं. इसलिए, डिकोडिंग का मुश्किल काम, मुख्य थ्रेड को ब्लॉक नहीं करता.

Kotlin

suspend fun extractFrame(context: Context, mediaItem: MediaItem) {
    try {
        // 1. Build the frame extractor.
        // `FrameExtractor` implements `AutoCloseable`, so wrap it in
        // a Kotlin `.use` block, which calls `close()` automatically.
        FrameExtractor.Builder(context, mediaItem).build().use { extractor ->
            // 2. Extract frames asynchronously.
            val frame = extractor.getFrame(5000L).await()
            val thumbnail = extractor.thumbnail.await()
            handleFrame(frame, thumbnail)
        }
    } catch (e: Exception) {
        Log.e(TAG, "Exception: $e")
    }
}

Java

public void extractFrame(Context context, MediaItem mediaItem) {
    // 1. Build the frame extractor.
    // `FrameExtractor` implements `AutoCloseable`, so use try-with-resources
    // so that the resources are automatically released.
    try (FrameExtractor frameExtractor = new FrameExtractor.Builder(context, mediaItem).build()) {
        // 2. Extract frames asynchronously.
        ListenableFuture<FrameExtractor.Frame> frameFuture = frameExtractor.getFrame(5000L);
        ListenableFuture<FrameExtractor.Frame> thumbnailFuture = frameExtractor.getThumbnail();

        ListenableFuture<List<Object>> allFutures = Futures.allAsList(frameFuture, thumbnailFuture);
        Futures.addCallback(allFutures, new FutureCallback<>() {
            @Override
            public void onSuccess(List<Object> result) {
                handleFrame(Futures.getUnchecked(frameFuture), Futures.getUnchecked(thumbnailFuture));
            }

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