तेज़ी से हो रही गतिविधि को साफ़ तौर पर कैप्चर करना, आधुनिक कैमरा ऐप्लिकेशन की एक अहम सुविधा है. ऐसा हाई-स्पीड कैप्चर की मदद से किया जाता है. यह 120 या 240 एफ़पीएस जैसे रेट पर फ़्रेम पाने की प्रोसेस है. इस हाई-फ़िडेलिटी कैप्चर का इस्तेमाल दो अलग-अलग कामों के लिए किया जा सकता है: हाई-फ़्रेम-रेट वाला वीडियो बनाना, ताकि फ़्रेम-बाय-फ़्रेम विश्लेषण किया जा सके या स्लो-मोशन वीडियो जनरेट करना, ताकि स्क्रीन पर ऐक्शन को नाटकीय तरीके से दिखाया जा सके.
पहले, Camera2 API के साथ इन सुविधाओं को लागू करने के लिए, ज़्यादा मेहनत करनी पड़ती थी. अब CameraX 1.5 में उपलब्ध नए हाई-स्पीड एपीआई की मदद से, पूरी प्रोसेस को आसान बना दिया गया है. इससे आपको हाई-फ़्रेम-रेट वाले वीडियो या तुरंत चलने वाली स्लो-मोशन क्लिप बनाने की सुविधा मिलती है. इस पोस्ट में, इन दोनों को बेहतर तरीके से इस्तेमाल करने का तरीका बताया गया है. अगर आपने CameraX का इस्तेमाल पहले कभी नहीं किया है, तो CameraX की खास जानकारी लेख पढ़ें.
स्लो मोशन के पीछे का सिद्धांत
स्लो-मोशन का बुनियादी सिद्धांत यह है कि वीडियो को प्लेबैक करने के मुकाबले, ज़्यादा फ़्रेम रेट पर कैप्चर किया जाए. उदाहरण के लिए, अगर आपने 120 फ़्रेम प्रति सेकंड (एफ़पीएस) पर एक सेकंड का इवेंट रिकॉर्ड किया है और फिर उस रिकॉर्डिंग को स्टैंडर्ड 30 एफ़पीएस पर चलाया है, तो वीडियो को चलने में चार सेकंड लगेंगे. समय को "खींचने" से ही स्लो-मोशन वाला नाटकीय इफ़ेक्ट मिलता है. इससे आपको ऐसी जानकारी देखने में मदद मिलती है जिसे सामान्य तौर पर देखना मुश्किल होता है.
यह पक्का करने के लिए कि फ़ाइनल आउटपुट वीडियो स्मूद और फ़्लूड हो, इसे आम तौर पर कम से कम 30 फ़्रेम प्रति सेकंड (एफ़पीएस) पर रेंडर किया जाना चाहिए. इसका मतलब है कि 4x स्लो-मोशन वीडियो बनाने के लिए, ओरिजनल कैप्चर फ़्रेम रेट कम से कम 120 fps होना चाहिए (120 कैप्चर fps ÷ 4 = 30 प्लेबैक fps).
ज़्यादा फ़्रेम रेट वाला फ़ुटेज कैप्चर करने के बाद, मनमुताबिक नतीजे पाने के दो मुख्य तरीके हैं:
- प्लेयर के हिसाब से स्लो-मोशन (ज़्यादा फ़्रेम रेट वाला वीडियो): ज़्यादा स्पीड में रिकॉर्ड किया गया वीडियो (जैसे, 120 एफ़पीएस) सीधे तौर पर, ज़्यादा फ़्रेम रेट वाले वीडियो फ़ाइल के तौर पर सेव होता है. इसके बाद, वीडियो प्लेयर की यह ज़िम्मेदारी होती है कि वह वीडियो चलाने की स्पीड को कम करे. इससे उपयोगकर्ता को सामान्य और धीमी गति से वीडियो चलाने के बीच टॉगल करने की सुविधा मिलती है.
- स्लो-मोशन में चलाने के लिए तैयार वीडियो (फिर से एन्कोड किया गया वीडियो): हाई स्पीड वाली वीडियो स्ट्रीम को प्रोसेस किया जाता है. इसके बाद, इसे स्टैंडर्ड फ़्रेम रेट (जैसे, 30 एफ़पीएस) वाली फ़ाइल में फिर से एन्कोड किया जाता है. फ़्रेम के टाइमस्टैंप में बदलाव करके, स्लो मोशन इफ़ेक्ट "बेक इन" किया जाता है. इस तरह से तैयार किया गया वीडियो, किसी भी स्टैंडर्ड वीडियो प्लेयर में स्लो मोशन में चलेगा. इसके लिए, किसी खास सेटिंग की ज़रूरत नहीं होगी. वीडियो डिफ़ॉल्ट रूप से स्लो मोशन में चलता है. हालांकि, वीडियो प्लेयर अब भी वीडियो चलाने की स्पीड कंट्रोल करने की सुविधा दे सकते हैं. इससे उपयोगकर्ता, वीडियो चलाने की स्पीड बढ़ा सकते हैं और वीडियो को उसकी ओरिजनल स्पीड में देख सकते हैं.
CameraX API, इस प्रोसेस को आसान बनाता है. यह आपको एक ही तरीके से यह चुनने का विकल्प देता है कि आपको कौनसी प्रोसेस इस्तेमाल करनी है. इसके बारे में यहां बताया गया है.
ज़्यादा स्पीड वाला नया Video 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 या 960fps हो:
- थंबनेल में यूज़र इंटरफ़ेस (यूआई) की पहचान: आपकी Google Photos लाइब्रेरी में, स्लो-मोशन वीडियो की पहचान यूज़र इंटरफ़ेस (यूआई) के खास एलिमेंट से की जा सकती है. इससे उन्हें सामान्य वीडियो से अलग किया जा सकता है.
- वीडियो चलाने की स्पीड को अडजस्ट करने की सुविधा: Google Photos में, स्लो-मोशन वीडियो चलाने के दौरान, वीडियो के कुछ हिस्सों को धीमी स्पीड पर और कुछ हिस्सों को सामान्य स्पीड पर चलाने की सुविधा मिलती है. इससे उपयोगकर्ताओं को क्रिएटिव कंट्रोल मिलता है. इसके बाद, शेयर करें बटन का इस्तेमाल करके, बदले गए वीडियो को नई वीडियो फ़ाइल के तौर पर एक्सपोर्ट किया जा सकता है. ऐसा करने पर, स्लो-मोशन वाले सेगमेंट में कोई बदलाव नहीं होगा.
डिवाइस से जुड़ी सहायता के बारे में जानकारी
CameraX का हाई-स्पीड एपीआई, Android के CamcorderProfile सिस्टम पर निर्भर करता है. इससे यह तय किया जाता है कि कोई डिवाइस, हाई-स्पीड के किन रिज़ॉल्यूशन और फ़्रेम रेट के साथ काम करता है. CamcorderProfiles की पुष्टि 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() शून्य वैल्यू दिखाता है, तो यह कार्रवाई IllegalArgumentException के साथ पूरी नहीं होगी. Google Pixel डिवाइसों पर, इस सुविधा के काम करने की पुष्टि की जा सकती है. ऐसा इसलिए, क्योंकि इनमें हमेशा हाई-स्पीड प्रोफ़ाइलें शामिल होती हैं. इसके अलावा, Motorola Edge 30, OPPO Find N2 Flip, और Sony Xperia 1 V जैसे अन्य मैन्युफ़ैक्चरर के कई डिवाइसों में भी हाई-स्पीड वीडियो की सुविधा काम करती है.
नतीजा
CameraX हाई-स्पीड वीडियो एपीआई, बेहतरीन और आसानी से इस्तेमाल किया जा सकता है. चाहे आपको तकनीकी विश्लेषण के लिए, ज़्यादा फ़्रेम रेट वाला फ़ुटेज चाहिए हो या अपने ऐप्लिकेशन में सिनेमैटिक स्लो-मोशन इफ़ेक्ट जोड़ने हों, HighSpeedVideoSessionConfig एक आसान और बेहतर समाधान उपलब्ध कराता है. setSlowMotionEnabled फ़्लैग की भूमिका को समझकर, इन दोनों इस्तेमाल के उदाहरणों को आसानी से लागू किया जा सकता है. साथ ही, उपयोगकर्ताओं को क्रिएटिव पर ज़्यादा कंट्रोल दिया जा सकता है.
पढ़ना जारी रखें
-
कैसे करें
चाहे Android Studio में Gemini का इस्तेमाल किया जा रहा हो, Gemini CLI का, Antigravity का या Claude Code या Codex जैसे तीसरे पक्ष के एजेंट का, हमारा मकसद यह पक्का करना है कि हर जगह बेहतरीन क्वालिटी के Android ऐप्लिकेशन बनाए जा सकें.
Adarsh Fernando, Esteban de la Canal • 4 मिनट में पढ़ें
-
कैसे करें
Google को पता है कि Android उपयोगकर्ताओं के लिए, बैटरी का ज़्यादा खर्च होना एक बड़ी समस्या है. इसलिए, Google ने डेवलपर की मदद करने के लिए कई अहम कदम उठाए हैं, ताकि वे कम बैटरी खर्च करने वाले ऐप्लिकेशन बना सकें.
Alice Yuan • आठ मिनट में पढ़ें
-
कैसे करें
हम आपको डिवाइस और क्लाउड, दोनों मॉडल का इस्तेमाल करके एआई की मदद से काम करने वाली सुविधाओं के उदाहरण देना चाहते थे. साथ ही, हम आपको अपने उपयोगकर्ताओं के लिए शानदार अनुभव बनाने के लिए प्रेरित करना चाहते थे.
Thomas Ezan, Ivy Knight • दो मिनट में पढ़ें
अप-टू-डेट रहें
Android डेवलपमेंट से जुड़ी नई अहम जानकारी, हर हफ़्ते अपने इनबॉक्स में पाएं.