तरीका बताने वाले लेख

CameraX 1.5 की मदद से, हाई-स्पीड कैप्चर और स्लो-मोशन वीडियो बनाना

पढ़ने में 6 मिनट लगेंगे
चार्ल्स मंगर की प्रोफ़ाइल देखें
Leo Huang सॉफ़्टवेयर इंजीनियर

तेज़ी से होने वाली गतिविधियों को साफ़ तौर पर कैप्चर करना, आज के समय के कैमरा ऐप्लिकेशन की एक अहम सुविधा है. यह सुविधा, हाई-स्पीड कैप्चर की मदद से मिलती है. यह 120 या 240 एफ़पीएस जैसे फ़्रेम रेट पर फ़्रेम कैप्चर करने की प्रोसेस है. हाई-फ़िडेलिटी कैप्चर का इस्तेमाल दो अलग-अलग मकसद के लिए किया जा सकता है: हाई-फ़्रेम-रेट वीडियो बनाना, ताकि फ़्रेम-दर-फ़्रेम विश्लेषण किया जा सके या स्लो-मोशन वीडियो जनरेट करना, जिसमें स्क्रीन पर गतिविधियां नाटकीय तरीके से दिखें.

पहले, Camera2 API की मदद से इन सुविधाओं को लागू करने के लिए, ज़्यादा काम करना पड़ता था. अब, CameraX 1.5 में मौजूद हाई-स्पीड एपीआई की मदद से, पूरी प्रोसेस आसान हो गई है. इससे, आपको असली हाई-फ़्रेम-रेट वीडियो या स्लो-मोशन क्लिप बनाने की सुविधा मिलती है. इस पोस्ट में, आपको इन दोनों के बारे में बताया जाएगा. CameraX का इस्तेमाल पहली बार करने वाले लोग, CameraX की खास जानकारी पढ़कर इसके बारे में जान सकते हैं.


स्लो-मोशन के पीछे का सिद्धांत

स्लो-मोशन का बुनियादी सिद्धांत यह है कि वीडियो को, प्लेबैक के मुकाबले ज़्यादा फ़्रेम रेट पर कैप्चर किया जाए. उदाहरण के लिए, अगर 120 फ़्रेम प्रति सेकंड (एफ़पीएस) पर एक सेकंड का कोई इवेंट रिकॉर्ड किया जाता है और फिर उस रिकॉर्डिंग को 30 एफ़पीएस के स्टैंडर्ड रेट पर चलाया जाता है, तो वीडियो को चलने में चार सेकंड लगेंगे. समय को "खींचने" से ही स्लो-मोशन का नाटकीय इफ़ेक्ट बनता है. इससे, आपको ऐसी जानकारी देखने को मिलती है जो सामान्य तौर पर बहुत तेज़ी से होती है.

यह पक्का करने के लिए कि फ़ाइनल आउटपुट वीडियो स्मूद और फ़्लूइड हो, इसे आम तौर पर कम से कम 30 एफ़पीएस पर रेंडर किया जाना चाहिए. इसका मतलब है कि 4x स्लो-मोशन वीडियो बनाने के लिए, ओरिजनल कैप्चर फ़्रेम रेट कम से कम 120 एफ़पीएस होना चाहिए (120 कैप्चर एफ़पीएस ÷ 4 = 30 प्लेबैक एफ़पीएस).

हाई-फ़्रेम-रेट फ़ुटेज कैप्चर करने के बाद, मनचाहा नतीजा पाने के दो मुख्य तरीके हैं:

  • प्लेयर-हैंडल किया गया स्लो-मोशन (हाई-फ़्रेम-रेट वीडियो): हाई-स्पीड रिकॉर्डिंग (उदाहरण के लिए, 120 एफ़पीएस) को सीधे हाई-फ़्रेम-रेट वीडियो फ़ाइल के तौर पर सेव किया जाता है. इसके बाद, वीडियो प्‍लेयर की ज़िम्मेदारी होती है कि वह वीडियो चलाने की स्पीड को कम करे. इससे उपयोगकर्ता को सामान्य और स्लो-मोशन प्लेबैक के बीच टॉगल करने की सुविधा मिलती है.
  • स्लो-मोशन वीडियो (फिर से एनकोड किया गया वीडियो): हाई-स्पीड वीडियो स्ट्रीम को प्रोसेस किया जाता है और फिर से एनकोड करके, स्टैंडर्ड फ़्रेम रेट (उदाहरण के लिए, 30 एफ़पीएस) वाली फ़ाइल बनाई जाती है. फ़्रेम टाइमस्टैंप को अडजस्ट करके, स्लो-मोशन इफ़ेक्ट "बेक इन" किया जाता है. इसके बाद, वीडियो को किसी भी स्टैंडर्ड वीडियो प्लेयर में स्लो मोशन में चलाया जा सकता है. इसके लिए, किसी खास सेटिंग की ज़रूरत नहीं होती. वीडियो डिफ़ॉल्ट रूप से स्लो मोशन में चलता है. हालांकि, वीडियो प्लेयर, वीडियो चलाने की स्पीड कंट्रोल करने की सुविधा दे सकते हैं. इससे उपयोगकर्ता, स्पीड बढ़ा सकते हैं और वीडियो को उसकी ओरिजनल स्पीड पर देख सकते हैं.

CameraX API, आपको यह सुविधा देता है कि आप यह चुन सकें कि आपको कौनसा तरीका अपनाना है. इससे यह प्रोसेस आसान हो जाती है. इसके बारे में यहां बताया गया है.


हाई-स्पीड वीडियो के लिए नया एपीआई

CameraX का नया सलूशन, दो मुख्य कॉम्पोनेंट पर आधारित है:

  • Recorder#getHighSpeedVideoCapabilities(CameraInfo): इस तरीके से, यह देखा जा सकता है कि कैमरा हाई-स्पीड में रिकॉर्ड कर सकता है या नहीं. अगर हां, तो कौनसे रिज़ॉल्यूशन (Quality ऑब्जेक्ट) काम करते हैं.
  • HighSpeedVideoSessionConfig: यह एक खास कॉन्फ़िगरेशन ऑब्जेक्ट है. इसमें आपके VideoCapture और Preview इस्तेमाल के उदाहरण शामिल होते हैं. इससे CameraX को, हाई-स्पीड कैमरा सेशन बनाने का निर्देश मिलता है. ध्यान दें कि VideoCapture स्ट्रीम, कॉन्फ़िगर किए गए हाई फ़्रेम रेट पर काम करेगी. वहीं, Preview स्ट्रीम आम तौर पर कैमरा सिस्टम से, कम से कम 30 एफ़पीएस के स्टैंडर्ड रेट तक सीमित रहेगी, ताकि स्क्रीन पर वीडियो स्मूद दिखे.

शुरू करें

शुरू करने से पहले, पक्का करें कि आपने अपने ऐप्लिकेशन की build.gradle.kts फ़ाइल में, CameraX की ज़रूरी डिपेंडेंसी जोड़ी हों. आपको CameraX की मुख्य लाइब्रेरी के साथ-साथ, camera-video आर्टफ़ैक्ट की भी ज़रूरत होगी.

// build.gradle.kts (Module: app)

dependencies {

    val camerax_version = "1.5.1"


    implementation("androidx.camera:camera-core:$camerax_version")

    implementation("androidx.camera:camera-camera2:$camerax_version")

    implementation("androidx.camera:camera-lifecycle:$camerax_version")

    implementation("androidx.camera:camera-video:$camerax_version")

    implementation("androidx.camera:camera-view:$camerax_version")

}

प्रयोग के लिए एपीआई के बारे में नोट

यह ध्यान रखना ज़रूरी है कि फ़िलहाल, हाई-स्पीड रिकॉर्डिंग के एपीआई, एक्सपेरिमेंटल हैं. इसका मतलब है कि आने वाली रिलीज़ में इनमें बदलाव हो सकते हैं. इनका इस्तेमाल करने के लिए, आपको अपने कोड में यह एनोटेशन जोड़कर ऑप्ट-इन करना होगा:

@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)

लागू करना

दोनों तरह के वीडियो बनाने के लिए, सेटअप के एक जैसे चरण पूरे करने होते हैं. हाई-फ़्रेम-रेट वीडियो या स्लो-मोशन वीडियो बनाने का विकल्प, सिर्फ़ एक सेटिंग पर निर्भर करता है.

1. हाई-स्पीड कैप्चर सेट अप करना

सबसे पहले, आपको ProcessCameraProvider हासिल करना होगा. इसके बाद, डिवाइस की क्षमताओं की जांच करनी होगी और अपने इस्तेमाल के उदाहरण बनाने होंगे. आपका लक्ष्य चाहे जो भी हो, आपको यह प्रोसेस पूरी करनी होगी.

नीचे दिए गए कोड ब्लॉक में, सस्पेंड फ़ंक्शन के अंदर सेटअप का पूरा फ़्लो दिखाया गया है. इस फ़ंक्शन को, lifecycleScope.launch जैसे कोरूटीन स्कोप से कॉल किया जा सकता है.

// Add the OptIn annotation at the top of your function or class

@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)

private suspend fun setupCamera() {

    // Asynchronously get the CameraProvider

    val cameraProvider = ProcessCameraProvider.awaitInstance(this)



    // -- CHECK CAPABILITIES --

    val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA)

    val videoCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

    if (videoCapabilities == null) {

        // This camera device does not support high-speed video.

        return

    }




    // -- CREATE USE CASES --

    val preview = Preview.Builder().build()    


    // You can create a Recorder with default settings.

    // CameraX will automatically select a suitable quality.

    val recorder = Recorder.Builder().build()


    // Alternatively, to use a specific resolution, you can configure the
    // Recorder with a QualitySelector. This is useful if your app has
    // specific resolution requirements or you want to offer user
    // preferences. 

    // To use a specific quality, you can uncomment the following lines.

    // Get the list of qualities supported for high-speed video. 

    // val supportedQualities = videoCapabilities.getSupportedQualities(DynamicRange.SDR)

    // Build the Recorder using the quality from the supported list.

    // val recorderWithQuality = Recorder.Builder()

    //     .setQualitySelector(QualitySelector.from(supportedQualities.first()))

    //     .build()



    // Create the VideoCapture use case, using either recorder or recorderWithQuality

    val videoCapture = VideoCapture.withOutput(recorder)

    // Now you are ready to configure the session for your desired output...

}

2. अपना आउटपुट चुनना

अब आपको यह तय करना है कि आपको किस तरह का वीडियो बनाना है. यह कोड, ऊपर दिखाए गए setupCamera() suspend फ़ंक्शन के अंदर चलेगा.

पहला विकल्प: हाई-फ़्रेम-रेट वीडियो बनाना

अगर आपको फ़ाइनल फ़ाइल में हाई फ़्रेम रेट (उदाहरण के लिए, 120 एफ़पीएस वाला वीडियो) चाहिए, तो यह विकल्प चुनें.

// Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)


// Query and apply a supported frame rate. Common supported frame rates include 120 and 240 fps.

val supportedFrameRateRanges =

    cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())


sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

दूसरा विकल्प: स्लो-मोशन वीडियो बनाना, जिसे तुरंत चलाया जा सके

अगर आपको ऐसा वीडियो चाहिए जो किसी भी स्टैंडर्ड वीडियो प्लेयर में अपने-आप स्लो मोशन में चले, तो यह विकल्प चुनें.

// Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)



// This is the key: enable automatic slow-motion!

sessionConfigBuilder.setSlowMotionEnabled(true)



// Query and apply a supported frame rate. Common supported frame rates include 120, 240, and 480 fps.

val supportedFrameRateRanges =

   cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())

sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

स्लो-मोशन वीडियो बनाने के लिए, यह एक फ़्लैग ज़रूरी है. जब setSlowMotionEnabled की वैल्यू 'सही' होती है, तो CameraX, हाई-स्पीड स्ट्रीम को प्रोसेस करता है और उसे 30 एफ़पीएस वाली स्टैंडर्ड वीडियो फ़ाइल के तौर पर सेव करता है. स्लो-मोशन की स्पीड, कैप्चर फ़्रेम रेट और इस स्टैंडर्ड वीडियो चलाने की स्पीड के अनुपात से तय होती है.

उदाहरण के लिए:

  • 120 एफ़पीएस पर रिकॉर्ड करने से, 1/4x स्पीड पर चलने वाला वीडियो बनेगा (120 ÷ 30 = 4).
  • 240 एफ़पीएस पर रिकॉर्ड करने से, 1/8x स्पीड पर चलने वाला वीडियो बनेगा (240 ÷ 30 = 8).

वीडियो रिकॉर्ड करना

HighSpeedVideoSessionConfig को कॉन्फ़िगर करने और उसे लाइफ़साइकल से बाइंड करने के बाद, आखिरी चरण है रिकॉर्डिंग शुरू करना. आउटपुट के विकल्प तैयार करने, रिकॉर्डिंग शुरू करने, और वीडियो इवेंट को हैंडल करने की प्रोसेस, स्टैंडर्ड वीडियो कैप्चर के लिए भी यही होती है.

इस पोस्ट में, हाई-स्पीड कॉन्फ़िगरेशन पर फ़ोकस किया गया है. इसलिए, हम रिकॉर्डिंग की प्रोसेस के बारे में ज़्यादा जानकारी नहीं देंगे. FileOutputOptions या MediaStoreOutputOptions ऑब्जेक्ट तैयार करने से लेकर VideoRecordEvent कॉलबैक को हैंडल करने तक की पूरी जानकारी के लिए, कृपया VideoCapture का दस्तावेज़ देखें.

// Bind the session config to the lifecycle

cameraProvider.bindToLifecycle(

    this as LifecycleOwner,

    CameraSelector.DEFAULT_BACK_CAMERA,

    sessionConfigBuilder.build() // Bind the config object from Option A or B

)



// Start the recording using the VideoCapture use case

val recording = videoCapture.output

    .prepareRecording(context, outputOptions) // See docs for creating outputOptions

    .start(ContextCompat.getMainExecutor(context)) { recordEvent ->

        // Handle recording events (e.g., Start, Pause, Finalize)

    }

स्लो-मोशन वीडियो के लिए Google Photos की सुविधा

CameraX में setSlowMotionEnabled(true) को चालू करने पर, वीडियो फ़ाइल को स्टैंडर्ड वीडियो प्लेयर और गैलरी ऐप्लिकेशन में स्लो-मोशन में चलाया जा सकता है. साथ ही, इसे तुरंत पहचाना जा सकता है. खास तौर पर, Google Photos में इन स्लो-मोशन वीडियो के लिए बेहतर सुविधाएं मिलती हैं. हालांकि, इसके लिए ज़रूरी है कि कैप्चर फ़्रेम रेट 120, 240, 360, 480 या 960 एफ़पीएस हो:

  • थंबनेल में यूआई की अलग पहचान: Google Photos की लाइब्रेरी में, स्लो-मोशन वीडियो को खास यूआई एलिमेंट से पहचाना जा सकता है. इससे, उन्हें सामान्य वीडियो से अलग किया जा सकता है.
normal.png
slowmotion.png
सामान्य वीडियो का थंबनेलस्लो-मोशन वीडियो का थंबनेल
  • प्लेबैक के दौरान स्पीड वाले सेगमेंट को अडजस्ट करना: स्लो-मोशन वीडियो चलाते समय, Google Photos में कंट्रोल मिलते हैं. इनकी मदद से, यह अडजस्ट किया जा सकता है कि वीडियो के कौनसे हिस्से स्लो स्पीड में और कौनसे हिस्से सामान्य स्पीड में चलें. इससे उपयोगकर्ताओं को क्रिएटिव कंट्रोल मिलता है. इसके बाद, शेयर करें बटन का इस्तेमाल करके, एडिट किए गए वीडियो को नई वीडियो फ़ाइल के तौर पर एक्सपोर्ट किया जा सकता है. इसमें, आपके तय किए गए स्लो-मोशन सेगमेंट बने रहते हैं.
normal2.png
slowmotion2.png
सामान्य वीडियो का प्लेबैकस्लो-मोशन वीडियो 
प्लेबैक, जिसमें एडिटिंग 
कंट्रोल मौजूद हैं

डिवाइस से जुड़ी सहायता के बारे में नोट

CameraX का हाई-स्पीड एपीआई, यह तय करने के लिए कि कोई डिवाइस, हाई-स्पीड रिज़ॉल्यूशन और फ़्रेम रेट के कौनसे विकल्प के साथ काम कर सकता है, Android CamcorderProfile सिस्टम पर निर्भर करता है. CamcorderProfile की पुष्टि, Android Compatibility Test Suite (CTS) से की जाती है. इसका मतलब है कि डिवाइस की रिपोर्ट की गई वीडियो रिकॉर्डिंग की क्षमताओं पर भरोसा किया जा सकता है.

इसका मतलब है कि अगर कोई डिवाइस, अपने बिल्ट-इन कैमरा ऐप्लिकेशन से स्लो-मोशन वीडियो रिकॉर्ड कर सकता है, तो यह ज़रूरी नहीं है कि CameraX का हाई-स्पीड एपीआई भी काम करे. यह अंतर इसलिए होता है, क्योंकि डिवाइस बनाने वाली कंपनियां, अपने डिवाइस के फ़र्मवेयर में CamcorderProfile एंट्री भरती हैं. कभी-कभी, ज़रूरी हाई-स्पीड प्रोफ़ाइल शामिल नहीं की जाती हैं. जैसे, CamcorderProfile.QUALITY_HIGH_SPEED_1080P और CamcorderProfile.QUALITY_HIGH_SPEED_720P. जब ये प्रोफ़ाइल मौजूद नहीं होती हैं, तो Recorder.getHighSpeedVideoCapabilities() की वैल्यू null होती है.

इसलिए, प्रोग्राम के ज़रिए काम करने वाली सुविधाओं की जांच करने के लिए, हमेशा Recorder.getHighSpeedVideoCapabilities() का इस्तेमाल करना ज़रूरी है. ऐसा इसलिए, क्योंकि अलग-अलग डिवाइसों पर एक जैसा अनुभव देने के लिए, यह सबसे भरोसेमंद तरीका है. अगर किसी ऐसे डिवाइस पर HighSpeedVideoSessionConfig को बाइंड करने की कोशिश की जाती है जहां Recorder.getHighSpeedVideoCapabilities() की वैल्यू null होती है, तो यह कार्रवाई IllegalArgumentException के साथ फ़ेल हो जाएगी. Google Pixel डिवाइसों पर, इस सुविधा के काम करने की पुष्टि की जा सकती है, क्योंकि इनमें ये हाई-स्पीड प्रोफ़ाइल हमेशा शामिल होती हैं. इसके अलावा, अन्य कंपनियों के कई डिवाइसों पर भी हाई-स्पीड वीडियो की सुविधाएं काम करती हैं. जैसे, Motorola Edge 30, OPPO Find N2 Flip, और Sony Xperia 1 V.


नतीजा

CameraX का हाई-स्पीड वीडियो एपीआई, पावरफ़ुल होने के साथ-साथ फ़्लेक्सिबल भी है. तकनीकी विश्लेषण के लिए, आपको असली हाई-फ़्रेम-रेट फ़ुटेज चाहिए या अपने ऐप्लिकेशन में सिनमैटिक स्लो-मोशन इफ़ेक्ट जोड़ने हैं, HighSpeedVideoSessionConfig एक आसान और एक जैसा सलूशन उपलब्ध कराता है. setSlowMotionEnabled फ़्लैग की भूमिका को समझकर, दोनों तरह के वीडियो बनाने की सुविधा आसानी से दी जा सकती है. साथ ही, उपयोगकर्ताओं को ज़्यादा क्रिएटिव कंट्रोल दिया जा सकता है.

लेखक:
पढ़ना जारी रखें