अध्याय 22: कैमरा एक्सटेंशन (Camera Extensions)
नाइट मोड (Night Mode) या पोर्ट्रेट बोकेह (Portrait Bokeh) जैसे फीचर्स को स्क्रैच से बनाना बहुत कठिन है। Camera Extensions API (Android 12+) OEM के पहले से बने, हार्डवेयर-त्वरित (hardware-accelerated) पाइपलाइन को उजागर करके इसे आसान बनाता है।
जब आप EXTENSION_BOKEH का अनुरोध करते हैं, तो आप खुद कोई ML मॉडल नहीं चलाते - आप HAL को काम सौंप देते हैं, जो उसी एल्गोरिदम का उपयोग करता है जिसका उपयोग फोन का स्टॉक कैमरा ऐप करता है।
पांच मानक एक्सटेंशन (The Five Standard Extensions)
| एक्सटेंशन | विवरण | अनुमानित विलंबता (Latency) |
|---|---|---|
EXTENSION_NIGHT | मल्टी-फ्रेम लो-लाइट मर्ज। शोर (noise) को 4-6 गुना कम करता है। | 2.5s – 8s |
EXTENSION_BOKEH | पोर्ट्रेट के लिए सिंथेटिक बैकग्राउंड ब्लर। | 0.6s – 2s |
EXTENSION_HDR | डायनेमिक रेंज बढ़ाने के लिए मल्टी-एक्सपोज़र फ्यूजन। | 0.5s – 2.5s |
EXTENSION_FACE_RETOUCH | चेहरे की त्वचा को चिकना बनाना और दाग-धब्बे हटाना। | 0.4s – 1.2s |
EXTENSION_AUTOMATIC | दृश्य (scene) के आधार पर HAL खुद तय करता है कि क्या लगाना है। | दृश्य पर निर्भर |
आर्किटेक्चरल अंतर: स्टैंडर्ड बनाम एक्सटेंशन सेशन
एक CameraExtensionSession फ्रेम को सीधे आउटपुट पर नहीं भेजता। इसके बजाय, यह उन्हें OEM के इंटरमीडिएट प्रोसेसिंग पाइपलाइन (EIPP) के माध्यम से भेजता है।
- स्टैंडर्ड सेशन: बहुत तेज़ (33-66ms), सीधे ISP से आउटपुट।
- एक्सटेंशन सेशन: बहुत धीमा (500-8000ms), क्योंकि यह कई फ्रेम इकट्ठा करता है और उन पर भारी एल्गोरिदम चलाता है।
एक्सटेंशन सपोर्ट और साइज क्वेरी करना
एक्सटेंशन अक्सर सेंसर के अधिकतम रेज़ोल्यूशन को सपोर्ट नहीं करते हैं। आपको CameraExtensionCharacteristics का उपयोग करके समर्थित साइज और विलंबता (latency) की जांच करनी चाहिए।
getEstimatedCaptureLatencyRangeMillis() यह बताने के लिए बहुत महत्वपूर्ण है कि उपयोगकर्ता को शटर बटन दबाने के बाद कितनी देर इंतज़ार करना होगा।
कैमरा एक्सटेंशन सेशन बनाना
स्टैंडर्ड सेशन के विपरीत, यहाँ आपको ExtensionSessionConfiguration का उपयोग करना होता है।
val extensionConfig = ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_BOKEH,
outputSurfaces,
executor,
object : CameraExtensionSession.StateCallback() {
override fun onConfigured(session: CameraExtensionSession) {
// सेशन तैयार है, अब प्रीव्यू शुरू करें
}
}
)
cameraDevice.createExtensionSession(extensionConfig)
पोर्ट्रेट फोटो कैप्चर करना और लेटेंसी मैनेज करना
चूँकि एक्सटेंशन कैप्चर में समय लगता है, इसलिए हमेशा एक प्रोग्रेस बार या "कैप्चरिंग..." डायलॉग दिखाएं। onCaptureCompleted तभी फायर होगा जब पूरा प्रोसेसिंग खत्म हो जाएगा।
व्यावहारिक सीमाएँ और सामान्य गलतियाँ (Pitfalls)
- दिखावटी एक्सटेंशन: कुछ सस्ते फोन एक्सटेंशन को 'सपोर्टेड' बताते हैं लेकिन वास्तव में कोई प्रोसेसिंग नहीं करते। लेटेंसी चेक करके इसका पता लगाया जा सकता है।
- लॉजिकल आईडी: बोकेह (Bokeh) अक्सर केवल लॉजिकल कैमरा आईडी (जिसमें 2 लेंस हों) पर काम करता है, फिजिकल आईडी पर नहीं।
- मेमोरी: नाइट मोड एक बार में 250MB तक रैम ले सकता है। लगातार कई फोटो लेने पर ऐप क्रैश हो सकता है।
सारांश (Summary)
कैमरा एक्सटेंशन (Android 12+) आपको फोन के देशी (native) कैमरा फीचर्स जैसे नाइट और बोकेह मोड तक पहुँच देते हैं। यह CameraExtensionSession के माध्यम से काम करता है जो DSP/NPU पर भारी काम को ऑफलोड कर देता है। हमेशा समर्थित साइज और अनुमानित विलंबता की जांच करें ताकि उपयोगकर्ता को एक अच्छा अनुभव मिल सके।
आगे क्या है
अगले अध्याय में, हम सबसे जटिल लेकिन संतोषजनक Camera2 फीचर के बारे में जानेंगे: अध्याय 23: ज़ीरो शटर लैग (ZSL) और रीप्रोसेसिंग।