डिवाइस निर्माता OEM विक्रेता लाइब्रेरी द्वारा प्रदान किए गए कैमरा एक्सटेंशन इंटरफ़ेस के माध्यम से तीसरे पक्ष के डेवलपर्स के लिए बोकेह, नाइट मोड और एचडीआर जैसे एक्सटेंशन प्रदर्शित कर सकते हैं। OEM विक्रेता लाइब्रेरी में लागू एक्सटेंशन तक पहुंचने के लिए डेवलपर्स कैमरा2 एक्सटेंशन एपीआई और कैमराएक्स एक्सटेंशन एपीआई का उपयोग कर सकते हैं।
समर्थित एक्सटेंशन की सूची के लिए, जो कैमरा2 और कैमराएक्स में समान है, कैमराएक्स एक्सटेंशन एपीआई देखें। यदि आप कोई एक्सटेंशन जोड़ना चाहते हैं, तो इश्यू ट्रैकर के साथ बग दर्ज करें।
यह पृष्ठ वर्णन करता है कि उपकरणों पर OEM विक्रेता लाइब्रेरी को कैसे कार्यान्वित और सक्षम किया जाए।
वास्तुकला
निम्नलिखित आरेख कैमरा एक्सटेंशन इंटरफ़ेस या extensions-interface
की वास्तुकला का वर्णन करता है:
चित्र 1. कैमरा एक्सटेंशन आर्किटेक्चर आरेख
जैसा कि चित्र में दिखाया गया है, कैमरा एक्सटेंशन का समर्थन करने के लिए, आपको OEM विक्रेता लाइब्रेरी द्वारा प्रदान किए गए extensions-interface
लागू करने की आवश्यकता है। आपकी ओईएम विक्रेता लाइब्रेरी दो एपीआई सक्षम करती है: कैमराएक्स एक्सटेंशन एपीआई और कैमरा2 एक्सटेंशन एपीआई , जिनका उपयोग विक्रेता एक्सटेंशन तक पहुंचने के लिए क्रमशः कैमराएक्स और कैमरा2 ऐप्स द्वारा किया जाता है।
OEM विक्रेता लाइब्रेरी लागू करें
ओईएम विक्रेता लाइब्रेरी को लागू करने के लिए, camera-extensions-stub
फ़ाइलों को सिस्टम लाइब्रेरी प्रोजेक्ट में कॉपी करें। ये फ़ाइलें कैमरा एक्सटेंशन इंटरफ़ेस को परिभाषित करती हैं।
camera-extensions-stub
फ़ाइलें निम्नलिखित श्रेणियों में विभाजित हैं:
आवश्यक इंटरफ़ेस फ़ाइलें (संशोधित न करें)
-
PreviewExtenderImpl.java
-
ImageCaptureExtenderImpl.java
-
ExtenderStateListener.java
-
ProcessorImpl.java
-
PreviewImageProcessorImpl.java
-
CaptureProcessorImpl.java
-
CaptureStageImpl.java
-
RequestUpdateProcessorImpl.java
-
ProcessResultImpl.java
-
advanced/AdvancedExtenderImpl.java
-
advanced/Camera2OutputConfigImpl.java
-
advanced/Camera2SessionConfigImpl.java
-
advanced/ImageProcessorImpl.java
-
advanced/ImageReaderOutputConfigImpl.java
-
advanced/ImageReferenceImpl.java
-
advanced/MultiResolutionImageReaderOutputConfigImpl.java
-
advanced/OutputSurfaceImpl.java
-
advanced/RequestProcessorImpl.java
-
advanced/SessionProcessorImpl.java
-
advanced/SurfaceOutputConfigImpl.java
अनिवार्य कार्यान्वयन (अपना कार्यान्वयन जोड़ें)
-
ExtensionVersionImpl.java
-
InitializerImpl.java
बोकेह एक्सटेंडर कक्षाएं (यदि बोकेह एक्सटेंशन समर्थित है तो इसे लागू करें)
-
BokehImageCaptureExtenderImpl.java
-
BokehPreviewExtenderImpl.java
-
advanced/BokehAdvancedExtenderImpl.java
रात्रि विस्तारक कक्षाएं (यदि रात्रि विस्तार समर्थित है तो इसे लागू करें)
-
NightImageCaptureExtenderImpl.java
-
NightPreviewExtenderImpl.java
-
advanced/NightAdvancedExtenderImpl.java
ऑटो एक्सटेंडर कक्षाएं (यदि ऑटो एक्सटेंशन समर्थित है तो इसे लागू करें)
-
AutoImageCaptureExtenderImpl.java
-
AutoPreviewExtenderImpl.java
-
advanced/AutoAdvancedExtenderImpl.java
एचडीआर एक्सटेंडर कक्षाएं (यदि एचडीआर एक्सटेंशन समर्थित है तो इसे लागू करें)
-
HdrImageCaptureExtenderImpl.java
-
HdrPreviewExtenderImpl.java
-
advanced/HdrAdvancedExtenderImpl.java
फेस रीटच एक्सटेंडर कक्षाएं (यदि फेस रीटच एक्सटेंशन समर्थित है तो इसे लागू करें)
-
BeautyImageCaptureExtenderImpl.java
-
BeautyPreviewExtenderImpl.java
-
advanced/BeautyAdvancedExtenderImpl.java
उपयोगिताएँ (वैकल्पिक, हटाया जा सकता है)
-
advanced/Camera2OutputConfigImplBuilder.java
-
advanced/Camera2SessionConfigImplBuilder.java
आपको प्रत्येक एक्सटेंशन के लिए कार्यान्वयन प्रदान करने की आवश्यकता नहीं है। यदि आप कोई एक्सटेंशन लागू नहीं करते हैं, तो false
वापसी करने या संबंधित एक्सटेंडर कक्षाओं को हटाने के लिए isExtensionAvailable()
सेट करें। कैमरा2 और कैमराएक्स एक्सटेंशन एपीआई ऐप को रिपोर्ट करते हैं कि एक्सटेंशन अनुपलब्ध है।
आइए देखें कि कैमरा2 और कैमराएक्स एक्सटेंशन एपीआई किसी एक्सटेंशन को सक्षम करने के लिए विक्रेता लाइब्रेरी के साथ कैसे इंटरैक्ट करते हैं। निम्नलिखित आरेख एक उदाहरण के रूप में नाइट एक्सटेंशन का उपयोग करके अंत-से-अंत प्रवाह को दर्शाता है:
चित्र 2. रात्रि विस्तार कार्यान्वयन
संस्करण सत्यापन:
यह सुनिश्चित करने के लिए कि OEM-कार्यान्वित
extensions-interface
संस्करण, कैमरा2/X समर्थित संस्करणों के साथ संगत है, कैमरा2/XExtensionVersionImpl.checkApiVersion()
को कॉल करता है।विक्रेता पुस्तकालय आरंभीकरण:
InitializerImpl
में एक विधिinit()
है जो विक्रेता लाइब्रेरी को प्रारंभ करती है। कैमरा2/एक्स एक्सटेंडर कक्षाओं तक पहुंचने से पहले आरंभीकरण पूरा करता है।तात्कालिक विस्तारक वर्ग:
एक्सटेंशन के लिए एक्सटेंडर कक्षाओं को इंस्टेंट करता है। एक्सटेंडर दो प्रकार के होते हैं: बेसिक एक्सटेंडर और एडवांस्ड एक्सटेंडर। आपको सभी एक्सटेंशन के लिए एक एक्सटेंडर प्रकार लागू करना होगा। अधिक जानकारी के लिए, बेसिक एक्सटेंडर बनाम एडवांस्ड एक्सटेंडर देखें।
कैमरा2/एक्स जानकारी प्राप्त करने और एक्सटेंशन को सक्षम करने के लिए एक्सटेंडर कक्षाओं को इंस्टेंट और इंटरैक्ट करता है। किसी दिए गए एक्सटेंशन के लिए, कैमरा2/एक्स एक्सटेंडर कक्षाओं को कई बार इंस्टेंट कर सकता है। परिणामस्वरूप, कंस्ट्रक्टर या
init()
कॉल में हेवी-लिफ्टिंग इनिशियलाइज़ेशन न करें। भारी सामान केवल तभी उठाएं जब कैमरा सत्र शुरू होने वाला हो, जैसे कि जब बेसिक एक्सटेंडर मेंonInit()
कॉल किया जाता है या एडवांस्ड एक्सटेंडर मेंinitSession()
को कॉल किया जाता है।नाइट एक्सटेंशन के लिए, बेसिक एक्सटेंडर प्रकार के लिए निम्नलिखित एक्सटेंडर कक्षाएं तत्काल शुरू की जाती हैं:
-
NightImageCaptureExtenderImpl.java
-
NightPreviewExtenderImpl.java
और उन्नत विस्तारक प्रकार के लिए:
-
NightAdvancedExtenderImpl.java
-
एक्सटेंशन उपलब्धता जांचें:
एक्सटेंशन को सक्षम करने से पहले,
isExtensionAvailable()
जांच करता है कि एक्सटेंशन एक्सटेंडर इंस्टेंस के माध्यम से निर्दिष्ट कैमरा आईडी पर उपलब्ध है या नहीं।कैमरा जानकारी के साथ एक्सटेंडर को प्रारंभ करें:
कैमरा2/एक्स एक्सटेंडर इंस्टेंस पर
init()
को कॉल करता है और इसे कैमरा आईडी औरCameraCharacteristics
पास करता है।क्वेरी जानकारी:
समर्थित रिज़ॉल्यूशन जैसी जानकारी प्राप्त करने, अनुमानित विलंबता को कैप्चर करने और एक्सटेंशन को सक्षम करने की तैयारी में एक्सटेंडर से अनुरोध कुंजियों को कैप्चर करने के लिए एक्सटेंडर वर्ग को आमंत्रित करता है।
एक्सटेंडर पर एक्सटेंशन सक्षम करें:
एक्सटेंडर क्लास क्लास को सक्षम करने के लिए आवश्यक सभी इंटरफेस प्रदान करता है। यह OEM कार्यान्वयन को कैमरा2 पाइपलाइन में जोड़ने के लिए एक तंत्र प्रदान करता है जैसे कि कैप्चर अनुरोध पैरामीटर को इंजेक्ट करना या पोस्ट प्रोसेसर को सक्षम करना।
उन्नत एक्सटेंडर प्रकार के लिए, कैमरा2/एक्स एक्सटेंशन को सक्षम करने के लिए
SessionProcessorImpl
के साथ इंटरैक्ट करता है। कैमरा2/X एक्सटेंडर परcreateSessionProcessor()
कॉल करकेSessionProcessorImpl
इंस्टेंस को पुनः प्राप्त करता है।
निम्नलिखित अनुभाग विस्तार प्रवाह का अधिक विस्तार से वर्णन करते हैं।
संस्करण सत्यापन
रनटाइम पर डिवाइस से ओईएम विक्रेता लाइब्रेरी को लोड करते समय, कैमरा2/एक्स सत्यापित करता है कि लाइब्रेरी extensions-interface
संस्करण के साथ संगत है या नहीं। extensions-interface
सिमेंटिक वर्जनिंग या MAJOR.MINOR.PATCH का उपयोग करता है, उदाहरण के लिए, 1.1.0 या 1.2.0। हालाँकि, संस्करण सत्यापन के दौरान केवल प्रमुख और लघु संस्करणों का उपयोग किया जाता है।
संस्करण को सत्यापित करने के लिए, कैमरा2/X समर्थित extensions-interface
संस्करण के साथ ExtensionVersionImpl.checkApiVersion()
को कॉल करता है। कैमरा2/एक्स फिर ओईएम लाइब्रेरी द्वारा रिपोर्ट किए गए संस्करण का उपयोग यह निर्धारित करने के लिए करता है कि क्या एक्सटेंशन सक्षम किया जा सकता है और इसे किन क्षमताओं का आह्वान करना चाहिए।
प्रमुख संस्करण अनुकूलता
यदि एक्सटेंशन-इंटरफ़ेस के प्रमुख संस्करण कैमरा2/X और विक्रेता लाइब्रेरी के बीच भिन्न हैं, तो इसे असंगत माना जाता है और एक्सटेंशन अक्षम कर दिया जाता है।
पश्च संगतता
जब तक प्रमुख संस्करण समान है, कैमरा2/एक्स पूर्व extensions-interface
संस्करणों के साथ निर्मित OEM विक्रेता लाइब्रेरीज़ के साथ बैकवर्ड संगतता सुनिश्चित करता है। उदाहरण के लिए, यदि कैमरा2/एक्स extensions-interface
1.3.0 का समर्थन करता है, तो 1.0.0, 1.1.0 और 1.2.0 लागू करने वाली OEM विक्रेता लाइब्रेरी अभी भी संगत हैं। इसका मतलब यह भी है कि विक्रेता लाइब्रेरी के एक विशिष्ट संस्करण को लागू करने के बाद, कैमरा 2/एक्स यह सुनिश्चित करता है कि लाइब्रेरी आगामी extension-interface
संस्करणों के साथ पिछड़े संगत है।
आगे की अनुकूलता
नए extensions-interface
के विक्रेता पुस्तकालयों के साथ आगे की अनुकूलता आप पर निर्भर करती है, ओईएम पर। यदि आपको एक्सटेंशन लागू करने के लिए कुछ सुविधाओं की आवश्यकता है, तो आप एक निश्चित संस्करण से शुरू होने वाले एक्सटेंशन को सक्षम करना चाहेंगे। इस मामले में, जब कैमरा2/एक्स लाइब्रेरी संस्करण आवश्यकताओं को पूरा करता है तो आप समर्थित extensions-interface
संस्करण वापस कर सकते हैं। यदि कैमरा2/X संस्करण समर्थित नहीं हैं, तो आप एक्सटेंशन को अक्षम करने के लिए 99.0.0 जैसे असंगत संस्करण को वापस कर सकते हैं।
विक्रेता पुस्तकालय आरंभीकरण
OEM लाइब्रेरी द्वारा कार्यान्वित extensions-interface
संस्करण को सत्यापित करने के बाद, कैमरा2/X आरंभीकरण प्रक्रिया शुरू करता है। InitializerImpl.init()
विधि OEM लाइब्रेरी को संकेत देती है कि कोई ऐप एक्सटेंशन का उपयोग करने का प्रयास कर रहा है।
जब तक OEM विक्रेता लाइब्रेरी आरंभीकरण के पूरा होने की सूचना देने के लिए OnExtensionsInitializedCallback.onSuccess()
को कॉल नहीं करती, तब तक कैमरा2/X OEM लाइब्रेरी में कोई अन्य कॉल नहीं करता (संस्करण जांच के अलावा)।
आपको InitializerImpl
extensions-interface
1.1.0 के रूप में लागू करना होगा। यदि OEM विक्रेता लाइब्रेरी extensions-interface
1.0.0 लागू करती है, तो कैमरा2/X लाइब्रेरी आरंभीकरण चरण को छोड़ देता है।
बेसिक एक्सटेंडर बनाम एडवांस्ड एक्सटेंडर
extensions-interface
कार्यान्वयन दो प्रकार के होते हैं: बेसिक एक्सटेंडर और एडवांस्ड एक्सटेंडर। एडवांस्ड एक्सटेंडर को extensions-interface
1.2.0 के बाद से समर्थित किया गया है।
एक्सटेंशन के लिए बेसिक एक्सटेंडर लागू करें जो कैमरा एचएएल में छवियों को संसाधित करता है या वाईयूवी स्ट्रीम को संसाधित करने में सक्षम पोस्ट प्रोसेसर का उपयोग करता है।
उन एक्सटेंशन के लिए उन्नत एक्सटेंडर लागू करें जिन्हें कैमरा2 स्ट्रीम कॉन्फ़िगरेशन को अनुकूलित करने और आवश्यकतानुसार कैप्चर अनुरोध भेजने की आवश्यकता है।
तुलना के लिए निम्न तालिका देखें:
बुनियादी विस्तारक | उन्नत विस्तारक | |
---|---|---|
स्ट्रीम कॉन्फ़िगरेशन | तय पूर्वावलोकन: PRIVATE या YUV_420_888 (यदि प्रोसेसर मौजूद है)अभी भी कैप्चर करें: JPEG या YUV_420_888 (यदि प्रोसेसर मौजूद है) | OEM द्वारा अनुकूलन योग्य। |
कैप्चर अनुरोध भेजा जा रहा है | केवल कैमरा2/एक्स ही कैप्चर अनुरोध भेज सकता है। आप इन अनुरोधों के लिए पैरामीटर सेट कर सकते हैं। जब प्रोसेसर को छवि कैप्चर के लिए प्रदान किया जाता है, तो कैमरा2/एक्स एकाधिक कैप्चर अनुरोध भेज सकता है और सभी छवियां और कैप्चर परिणाम प्रोसेसर को भेज सकता है। | कैमरा2 कैप्चर अनुरोध को निष्पादित करने और परिणाम और छवि प्राप्त करने के लिए आपको एक RequestProcessorImpl उदाहरण प्रदान किया जाता है। कैमरा2/X OEM को पूर्वावलोकन के लिए दोहराए जाने वाले अनुरोध को |
कैमरे की पाइपलाइन में हुक |
|
|
के लिए उपयुक्त | कैमरा HAL या प्रोसेसर में लागू किए गए एक्सटेंशन जो YUV छवियों को संसाधित करते हैं। |
|
समर्थित एपीआई संस्करण | कैमरा2 एक्सटेंशन: Android 13 या उच्चतर कैमराएक्स एक्सटेंशन: camera-extensions 1.1.0 या उच्चतर | कैमरा2 एक्सटेंशन: Android 12L या उच्चतर कैमराएक्स एक्सटेंशन: camera-extensions 1.2.0-अल्फा03 या उच्चतर |
ऐप प्रवाहित होता है
निम्न तालिका तीन प्रकार के ऐप प्रवाह और उनके संबंधित कैमरा एक्सटेंशन एपीआई कॉल दिखाती है। जबकि कैमरा2/एक्स ये एपीआई प्रदान करता है, आपको इन प्रवाहों का समर्थन करने के लिए विक्रेता लाइब्रेरी को उचित रूप से कार्यान्वित करना होगा, जिसे हम बाद के अनुभाग में अधिक विस्तार से वर्णित करेंगे।
कैमरा2 एक्सटेंशन | कैमराएक्स एक्सटेंशन | |
---|---|---|
क्वेरी एक्सटेंशन उपलब्धता | CameraExtensionCharacteristics . getSupportedExtensions | ExtensionsManager. isExtensionAvailable |
जानकारी पूछें | CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys | ExtensionsManager. getEstimatedCaptureLatencyRange कैमराएक्स लाइब्रेरी के भीतर बाकी जानकारी को संभालता है। |
एक्सटेंशन सक्षम होने पर पूर्वावलोकन और स्टिल-कैप्चर करें | CameraDevice. createExtensionSession | val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector (जीवनचक्रस्वामी, कैमरा चयनकर्ता, पूर्वावलोकन, ...) |
बुनियादी विस्तारक
बेसिक एक्सटेंडर इंटरफ़ेस कैमरा पाइपलाइन में कई स्थानों पर हुक प्रदान करता है। प्रत्येक एक्सटेंशन प्रकार में संबंधित एक्सटेंडर वर्ग होते हैं जिन्हें ओईएम को लागू करने की आवश्यकता होती है।
निम्न तालिका उन एक्सटेंडर वर्गों को सूचीबद्ध करती है जिन्हें ओईएमएस को प्रत्येक एक्सटेंशन के लिए लागू करने की आवश्यकता है:
लागू करने के लिए विस्तारक वर्ग | |
---|---|
रात | NightPreviewExtenderImpl.java |
एचडीआर | HdrPreviewExtenderImpl.java |
ऑटो | AutoPreviewExtenderImpl.java |
bokeh | BokehPreviewExtenderImpl.java |
चेहरा सुधारना | BeautyPreviewExtenderImpl.java |
हम निम्नलिखित उदाहरण में प्लेसहोल्डर के रूप में PreviewExtenderImpl
और ImageCaptureExtenderImpl
का उपयोग करते हैं। इन्हें उन वास्तविक फ़ाइलों के नामों से बदलें जिन्हें आप कार्यान्वित कर रहे हैं।
बेसिक एक्सटेंडर में निम्नलिखित क्षमताएं हैं:
-
CameraCaptureSession
(onPresetSession
) को कॉन्फ़िगर करते समय सत्र पैरामीटर इंजेक्ट करें। - कैप्चर सत्र प्रारंभ और समापन घटनाओं के बारे में आपको सूचित करें और लौटाए गए पैरामीटर (
onEnableSession
,onDisableSession
) के साथ HAL को सूचित करने के लिए एक एकल अनुरोध भेजें। - अनुरोध के लिए कैप्चर पैरामीटर इंजेक्ट करें (
PreviewExtenderImpl.getCaptureStage
,ImageCaptureExtenderImpl.getCaptureStages
)। - पूर्वावलोकन के लिए प्रोसेसर जोड़ें और अभी भी कैप्चर करें जो
YUV_420_888
स्ट्रीम को संसाधित करने में सक्षम है।
आइए देखें कि ऊपर उल्लिखित तीन ऐप प्रवाह को प्राप्त करने के लिए कैमरा2/एक्स extensions-interface
कैसे लागू करता है।
ऐप प्रवाह 1: एक्सटेंशन उपलब्धता की जाँच करें
चित्र 3. बेसिक एक्सटेंडर पर ऐप प्रवाह 1
इस प्रवाह में, कैमरा2/X init() को कॉल किए बिना सीधे PreviewExtenderImpl
और ImageCaptureExtenderImpl
दोनों की isExtensionAvailable()
init()
को कॉल करता है। एक्सटेंशन को सक्षम करने के लिए दोनों एक्सटेंडर वर्गों को true
लौटना होगा।
यह अक्सर ऐप्स के लिए यह जांचने का पहला कदम होता है कि एक्सटेंशन सक्षम करने से पहले दिया गया एक्सटेंशन प्रकार किसी दिए गए कैमरा आईडी के लिए समर्थित है या नहीं। ऐसा इसलिए है क्योंकि कुछ एक्सटेंशन केवल कुछ कैमरा आईडी पर ही समर्थित होते हैं।
ऐप प्रवाह 2: जानकारी क्वेरी करें
चित्र 4. बेसिक एक्सटेंडर पर ऐप फ्लो 2
यह निर्धारित करने के बाद कि एक्सटेंशन उपलब्ध है या नहीं, ऐप्स को एक्सटेंशन सक्षम करने से पहले निम्नलिखित जानकारी पूछनी चाहिए।
अभी भी विलंबता सीमा कैप्चर करें:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
ऐप के मूल्यांकन के लिए कैप्चर विलंबता की सीमा लौटाता है कि क्या यह वर्तमान परिदृश्य के लिए एक्सटेंशन को सक्षम करने के लिए उपयुक्त है।पूर्वावलोकन और कैप्चर सतह के लिए समर्थित आकार:
ImageCaptureExtenderImpl.getSupportedResolutions
औरPreviewExtenderImpl.getSupportedResolutions
छवि प्रारूपों और आकारों की एक सूची लौटाते हैं जो सतह प्रारूप और आकार के लिए समर्थित हैं।समर्थित अनुरोध और परिणाम कुंजियाँ: कैमरा2/X आपके कार्यान्वयन से समर्थित कैप्चर अनुरोध कुंजियाँ और परिणाम कुंजियाँ पुनः प्राप्त करने के लिए निम्नलिखित विधियों को लागू करता है:
-
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
-
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
-
कैमरा2/X हमेशा अधिक जानकारी के लिए पूछताछ करने से पहले इन एक्सटेंडर कक्षाओं पर init()
को कॉल करता है।
ऐप प्रवाह 3: एक्सटेंशन सक्षम होने पर पूर्वावलोकन/अभी भी कैप्चर करें (एचएएल कार्यान्वयन)
चित्र 5. बेसिक एक्सटेंडर पर ऐप फ़्लो 3
उपरोक्त आरेख बिना किसी प्रोसेसर के एक्सटेंशन के साथ पूर्वावलोकन और स्टिल कैप्चर को सक्षम करने के मुख्य प्रवाह को दर्शाता है। इसका मतलब है कि कैमरा HAL एक्सटेंशन को प्रोसेस करता है।
इस प्रवाह में, कैमरा2/X पहले init()
फिर onInit
कॉल करता है, जो आपको सूचित करता है कि निर्दिष्ट एक्सटेंशन के साथ एक कैमरा सत्र शुरू होने वाला है। आप onInit()
में हेवी-लिफ्टिंग इनिशियलाइज़ेशन कर सकते हैं।
CameraCaptureSession
कॉन्फ़िगर करते समय, कैमरा2/एक्स सत्र पैरामीटर प्राप्त करने के लिए onPresetSession
आमंत्रित करता है। कैप्चर सत्र सफलतापूर्वक कॉन्फ़िगर होने के बाद, कैमरा2/X एक CaptureStageImpl
इंस्टेंस लौटाने वाले onEnableSession
आमंत्रित करता है जिसमें कैप्चर पैरामीटर होते हैं। कैमरा2/एक्स तुरंत एचएएल को सूचित करने के लिए इन कैप्चर मापदंडों के साथ एक अनुरोध भेजता है। इसी तरह, कैप्चर सत्र बंद होने से पहले, कैमरा2/एक्स onDisableSession
आमंत्रित करता है और फिर लौटाए गए कैप्चर पैरामीटर के साथ एक एकल अनुरोध भेजता है।
कैमरा2/एक्स द्वारा ट्रिगर किए गए दोहराए गए अनुरोध में PreviewExtenderImpl.getCaptureStage()
द्वारा लौटाए गए अनुरोध पैरामीटर शामिल हैं। इसके अलावा, स्टिल कैप्चर अनुरोध में ImageCaptureExtenderImpl.getCaptureStages()
द्वारा लौटाए गए पैरामीटर शामिल हैं।
अंत में, कैमरा सत्र समाप्त होने के बाद कैमरा2/X onDeInit()
को आमंत्रित करता है। आप onDeinit()
में संसाधन जारी कर सकते हैं।
पूर्वावलोकन प्रोसेसर
कैमरा एचएएल के अलावा, आप प्रोसेसर में एक्सटेंशन भी लागू कर सकते हैं।
नीचे बताए अनुसार प्रोसेसर प्रकार निर्दिष्ट करने के लिए PreviewExtenderImpl.getProcessorType
लागू करें:
PROCESSOR_TYPE_NONE
: कोई प्रोसेसर नहीं। छवियाँ कैमरे HAL में संसाधित की जाती हैं।PROCESSOR_TYPE_REQUEST_UPDATE_ONLY
: प्रोसेसर प्रकार आपको नवीनतमTotalCaptureResult
के आधार पर नए कैप्चर अनुरोध पैरामीटर के साथ दोहराए जाने वाले अनुरोध को अपडेट करने देता है।PreviewExtenderImpl.getProcessor
एकRequestUpdateProcessorImpl
इंस्टेंस लौटाना होगा जोTotalCaptureResult
इंस्टेंस को प्रोसेस करता है और दोहराए जाने वाले अनुरोध को अपडेट करने के लिए एकCaptureStageImpl
इंस्टेंस लौटाता है।PreviewExtenderImpl.getCaptureStage()
प्रसंस्करण के परिणाम को भी प्रतिबिंबित करना चाहिए और नवीनतमCaptureStageImpl
वापस करना चाहिए।PROCESSOR_TYPE_IMAGE_PROCESSOR
: यह प्रकार आपकोYUV_420_888
छवियों को संसाधित करने और आउटपुट को एकPRIVATE
सतह पर लिखने के लिए एक प्रोसेसर लागू करने की अनुमति देता है।आपको
PreviewExtenderImpl.getProcessor
में एकPreviewImageProcessorImpl
उदाहरण लागू करने और वापस करने की आवश्यकता है। प्रोसेसरYUV_420_888
इनपुट छवियों को संसाधित करने के लिए जिम्मेदार है। इसे आउटपुट को पूर्वावलोकन केPRIVATE
प्रारूप में लिखना चाहिए। पूर्वावलोकन के लिएCameraCaptureSession
कॉन्फ़िगर करने के लिए कैमरा2/एक्सPRIVATE
के बजायYUV_420_888
सतह का उपयोग करता है।प्रवाह के लिए निम्नलिखित चित्रण देखें:
चित्र 6. PreviewImageProcessorImpl
के साथ पूर्वावलोकन प्रवाह
PreviewImageProcessorImpl
इंटरफ़ेस, ProcessImpl
विस्तार करता है और इसमें तीन महत्वपूर्ण विधियाँ हैं:
onOutputSurface(Surface surface, int imageFormat)
प्रोसेसर के लिए आउटपुट सतह सेट करता है।PreviewImageProcessorImpl
के लिए,imageFormat
एक पिक्सेल प्रारूप है जैसे किPixelFormat.RGBA_8888
।onResolutionUpdate(Size size)
इनपुट छवि का आकार निर्धारित करता है।onImageFormatUpdate(int imageFormat)
इनपुट छवि का छवि प्रारूप सेट करता है। वर्तमान में, यह केवलYUV_420_888
हो सकता है।
छवि कैप्चर प्रोसेसर
स्टिल कैप्चर के लिए, आप ImageCaptureExtenderImpl.getCaptureProcessor
का उपयोग करके CaptureProcessorImpl
उदाहरण लौटाकर एक प्रोसेसर लागू कर सकते हैं। प्रोसेसर कैप्चर की गई YUV_420_888
छवियों और TotalCaptureResult
इंस्टेंसेस की सूची को संसाधित करने और आउटपुट को YUV_420_888
सतह पर लिखने के लिए जिम्मेदार है।
आप सुरक्षित रूप से मान सकते हैं कि स्टिल कैप्चर अनुरोध भेजने से पहले पूर्वावलोकन सक्षम है और चल रहा है।
नीचे दिए गए चित्र में प्रवाह देखें:
चित्र 7. CaptureProcessorImpl
के साथ अभी भी प्रवाह कैप्चर करें
कैप्चर सत्र को कॉन्फ़िगर करने के लिए कैमरा2/X स्थिर कैप्चर के लिए
YUV_420_888
प्रारूप सतह का उपयोग करता है। कैमरा2/एक्स कॉल करकेCaptureProcessorImpl
तैयार करता है:-
CaptureProcessorImpl.onImageFormatUpdate()
YUV_420_888
के साथ। -
CaptureProcessorImpl.onResolutionUpdate()
इनपुट छवि आकार के साथ। -
CaptureProcessorImpl.onOutputSurface()
आउटपुटYUV_420_888
सतह के साथ।
-
ImageCaptureExtenderImpl.getCaptureStages
CaptureStageImpl
की एक सूची लौटाता है, जहां प्रत्येक तत्व कैमरा2/X द्वारा भेजे गए कैप्चर पैरामीटर के साथCaptureRequest
इंस्टेंस पर मैप होता है। उदाहरण के लिए, यदि यह तीनCaptureStageImpl
उदाहरणों की सूची लौटाता है, तो कैमरा2/XcaptureBurst
एपीआई का उपयोग करके संबंधित कैप्चर पैरामीटर के साथ तीन कैप्चर अनुरोध भेजता है।प्राप्त छवियों और
TotalCaptureResult
उदाहरणों को एक साथ बंडल किया जाता है और प्रसंस्करण के लिएCaptureProcessorImpl
पर भेजा जाता है।CaptureProcessorImpl
परिणाम छवि (YUV_420_888
प्रारूप) कोonOutputSurface()
कॉल द्वारा निर्दिष्ट आउटपुट सतह पर लिखता है। यदि आवश्यक हो तो कैमरा2/एक्स इसे जेपीईजी छवियों में परिवर्तित करता है।
समर्थन कैप्चर अनुरोध कुंजियाँ और परिणाम
कैमरा पूर्वावलोकन और कैप्चर के अलावा, ऐप्स ज़ूम, फ़्लैश पैरामीटर सेट कर सकते हैं या टैप-टू-फ़ोकस ट्रिगर कर सकते हैं। ये पैरामीटर आपके एक्सटेंशन कार्यान्वयन के साथ संगत नहीं हो सकते हैं।
आपके कार्यान्वयन द्वारा समर्थित पैरामीटरों को उजागर करने की अनुमति देने के लिए extensions-interface
1.3.0 में निम्नलिखित विधियाँ जोड़ी गई हैं:
-
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
आपके कार्यान्वयन द्वारा समर्थित कैप्चर अनुरोध कुंजी लौटाता है। -
ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
कैप्चर परिणाम कुंजियाँ लौटाता है जो कैप्चर परिणाम में शामिल हैं।
यदि कैमरा HAL एक्सटेंशन को संसाधित करता है, तो कैमरा2/X CameraCaptureSession.CaptureCallback
में कैप्चर परिणाम पुनः प्राप्त करता है। हालाँकि, यदि प्रोसेसर कार्यान्वित किया जाता है, तो कैमरा2/X कैप्चर परिणाम को ProcessResultImpl
में पुनः प्राप्त करता है, जिसे PreviewImageProcessorImpl
और CaptureProcessorImpl
में process()
विधि में पास किया जाता है। आप ProcessResultImpl
के माध्यम से कैमरा2/X पर कैप्चर परिणाम की रिपोर्ट करने के लिए जिम्मेदार हैं।
उदाहरण के तौर पर नीचे CaptureProcessorImpl
इंटरफ़ेस की परिभाषा देखें। extensions-interface
1.3.0 या उच्चतर में, दूसरी process()
कॉल लागू की जाती है:
Interface CaptureProcessorImpl extends ProcessorImpl {
// invoked when extensions-interface version < 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
// invoked when extensions-interface version >= 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor);
}
ज़ूम, टैप-टू-फ़ोकस, फ़्लैश और एक्सपोज़र कंपंसेशन जैसे सामान्य कैमरा संचालन के लिए, हम कैप्चर अनुरोध और कैप्चर परिणाम दोनों के लिए निम्नलिखित कुंजियों का समर्थन करने की सलाह देते हैं:
- ज़ूम करें:
-
CaptureRequest#CONTROL_ZOOM_RATIO
-
CaptureRequest#SCALER_CROP_REGION
-
- टैप-टू-फोकस:
-
CaptureRequest#CONTROL_AF_MODE
-
CaptureRequest#CONTROL_AF_TRIGGER
-
CaptureRequest#CONTROL_AF_REGIONS
-
CaptureRequest#CONTROL_AE_REGIONS
-
CaptureRequest#CONTROL_AWB_REGIONS
-
- चमक:
-
CaptureRequest#CONTROL_AE_MODE
-
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
-
CaptureRequest#FLASH_MODE
-
- जोख़िम प्रतिपूर्ति:
-
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
-
1.2.0 या पूर्व संस्करणों को लागू करने वाले बेसिक एक्सटेंडरों के लिए, कैमराएक्स एक्सटेंशन एपीआई स्पष्ट रूप से उपरोक्त सभी कुंजियों का समर्थन करता है। extensions-interface
1.3.0 के लिए, कैमराएक्स और कैमरा2 दोनों लौटाई गई सूची का सम्मान करते हैं और केवल इसमें मौजूद कुंजियों का समर्थन करते हैं। उदाहरण के लिए, यदि आप 1.3.0 कार्यान्वयन में केवल CaptureRequest#CONTROL_ZOOM_RATIO
और CaptureRequest#SCALER_CROP_REGION
लौटाने का निर्णय लेते हैं, तो इसका मतलब है कि ऐप के लिए केवल ज़ूम समर्थित है जबकि टैप-टू-फोकस, फ्लैश और एक्सपोज़र मुआवजे की अनुमति नहीं है।
उन्नत विस्तारक
एडवांस्ड एक्सटेंडर कैमरा2 एपीआई पर आधारित एक प्रकार का विक्रेता कार्यान्वयन है। यह एक्सटेंडर प्रकार extensions-interface
1.2.0 में जोड़ा गया था। डिवाइस निर्माता के आधार पर, एक्सटेंशन को ऐप लेयर में लागू किया जा सकता है, जो निम्नलिखित कारकों पर निर्भर करता है:
कस्टम स्ट्रीम कॉन्फ़िगरेशन: RAW स्ट्रीम जैसी कस्टम स्ट्रीम कॉन्फ़िगर करें या विभिन्न भौतिक कैमरा आईडी के लिए एकाधिक स्ट्रीम रखें।
कैमरा2 अनुरोध भेजने की क्षमता: एक जटिल इंटरैक्शन लॉजिक का समर्थन करें जो पिछले अनुरोधों के परिणामों के आधार पर पैरामीटर के साथ कैप्चर अनुरोध भेज सकता है।
एडवांस्ड एक्सटेंडर एक रैपर, या एक मध्यवर्ती परत प्रदान करता है, जिससे आप स्ट्रीम कॉन्फ़िगरेशन को अनुकूलित कर सकते हैं और मांग पर कैप्चर अनुरोध भेज सकते हैं।
कार्यान्वयन हेतु फ़ाइलें
उन्नत एक्सटेंडर कार्यान्वयन पर स्विच करने के लिए, ExtensionVersionImpl
में isAdvancedExtenderImplemented()
विधि को true
वापस आना होगा। प्रत्येक एक्सटेंशन प्रकार के लिए, ओईएम को संबंधित एक्सटेंडर कक्षाएं लागू करनी होंगी। उन्नत विस्तारक कार्यान्वयन फ़ाइलें उन्नत पैकेज में हैं।
लागू करने के लिए विस्तारक वर्ग | |
---|---|
रात | advanced/NightAdvancedExtenderImpl.java |
एचडीआर | advanced/HdrAdvancedExtenderImpl.java |
ऑटो | advanced/AutoAdvancedExtenderImpl.java |
bokeh | advanced/BokehAdvancedExtenderImpl.java |
फेस रीटच | advanced/BeautyAdvancedExtenderImpl.java |
हम निम्नलिखित उदाहरण में एक प्लेसहोल्डर के रूप में AdvancedExtenderImpl
उपयोग करते हैं। आप जिस एक्सटेंशन को कार्यान्वित कर रहे हैं उसके लिए इसे एक्सटेंडर फ़ाइल के नाम से बदलें।
आइए देखें कि कैमरा2/एक्स तीन ऐप प्रवाह को प्राप्त करने के लिए extensions-interface
कैसे आमंत्रित करता है।
ऐप प्रवाह 1: एक्सटेंशन की उपलब्धता जांचें
चित्र 8. उन्नत विस्तारक पर ऐप प्रवाह 1
सबसे पहले, ऐप जाँचता है कि दिया गया एक्सटेंशन समर्थित है या नहीं।
ऐप प्रवाह 2: जानकारी क्वेरी करें
चित्र 9. उन्नत विस्तारक पर ऐप प्रवाह 2
AdvancedExtenderImpl.init()
कॉल करने के बाद, ऐप AdvancedExtenderImpl
पर निम्नलिखित जानकारी पूछ सकता है:
अनुमानित अभी भी कैप्चर विलंबता:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
ऐप के मूल्यांकन के लिए कैप्चर विलंबता की सीमा लौटाता है कि क्या यह वर्तमान परिदृश्य के लिए एक्सटेंशन को सक्षम करने के लिए उपयुक्त है।पूर्वावलोकन और स्टिल कैप्चर के लिए समर्थित रिज़ॉल्यूशन:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
आकार सूची में छवि प्रारूप का एक मानचित्र लौटाता है जो पूर्वावलोकन सतह प्रारूप और आकार के लिए समर्थित है। ओईएम को कम से कमPRIVATE
प्रारूप का समर्थन करना चाहिए।AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
स्थिर कैप्चर सतह के लिए समर्थित प्रारूप और आकार लौटाता है। OEM कोJPEG
औरYUV_420_888
प्रारूप आउटपुट दोनों का समर्थन करना चाहिए।AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
छवि विश्लेषण के लिए अतिरिक्तYUV_420_888
स्ट्रीम के लिए समर्थित आकार लौटाता है। यदि छवि विश्लेषण YUV सतह समर्थित नहीं है,getSupportedYuvAnalysisResolutions()
null
या खाली सूची लौटानी चाहिए।
उपलब्ध कैप्चर अनुरोध कुंजी/परिणाम (
extensions-interface
1.3.0 में जोड़ा गया): कैमरा2/एक्स आपके कार्यान्वयन से समर्थित कैप्चर अनुरोध कुंजी और परिणाम कुंजी को पुनः प्राप्त करने के लिए निम्नलिखित विधियों को लागू करता है:-
AdvancedExtenderImpl.getAvailableCaptureRequestKeys
-
AdvancedExtenderImpl.getAvailableCaptureResultKeys
-
अधिक जानकारी के लिए, समर्थन कैप्चर अनुरोध कुंजी और परिणाम देखें।
ऐप प्रवाह 3: एक्सटेंशन सक्षम होने पर पूर्वावलोकन/अभी भी कैप्चर करें
चित्र 10. उन्नत विस्तारक पर ऐप प्रवाह 3
उपरोक्त आरेख उन्नत एक्सटेंडर प्रकार के लिए पूर्वावलोकन शुरू करने और फिर भी कैप्चर करने के लिए मुख्य प्रवाह दिखाता है। आइए प्रत्येक चरण पर चलें।
SessionProcessorImpl
उदाहरणमुख्य उन्नत एक्सटेंडर कार्यान्वयन
SessionProcessorImpl
में है, जो अनुकूलित सत्र कॉन्फ़िगरेशन प्रदान करने और पूर्वावलोकन शुरू करने और फिर भी कैप्चर अनुरोध भेजने के लिए कैप्चर अनुरोध भेजने के लिए जिम्मेदार है।AdvancedExtenderImpl.createSessionProcessor()
कोSessionProcessorImpl
इंस्टेंस को वापस करने के लिए लागू किया जाता है।initSession
SessionProcessorImpl.initSession()
एक्सटेंशन के लिए सत्र प्रारंभ करता है। यह वह जगह है जहां आप संसाधन आवंटित करते हैं औरCameraCaptureSession
तैयार करने के लिए एक सत्र कॉन्फ़िगरेशन लौटाते हैं।इनपुट मापदंडों के लिए, कैमरा2/एक्स पूर्वावलोकन, स्टिल कैप्चर और एक वैकल्पिक YUV छवि विश्लेषण के लिए आउटपुट सतह कॉन्फ़िगरेशन निर्दिष्ट करता है। इस आउटपुट सतह कॉन्फ़िगरेशन (
OutputSurfaceImpl
) में सतह, आकार और छवि प्रारूप शामिल हैं जिन्हेंAdvancedExtenderImpl
में निम्नलिखित विधियों द्वारा पुनर्प्राप्त किया जाता है:-
getSupportedPreviewOutputResolutions()
-
getSupportedCaptureOutputResolutions()
-
getSupportedYuvAnalysisResolutions()
आपको एक
Camera2SessionConfigImpl
इंस्टेंस वापस करना होगा, जिसमेंCamera2OutputConfigImpl
इंस्टेंसेस की एक सूची औरCameraCaptureSession
कॉन्फ़िगर करने के लिए उपयोग किए जाने वाले सत्र पैरामीटर शामिल हैं। आप कैमरा2/एक्स द्वारा पारित आउटपुट सतहों पर सही कैमरा छवियों को आउटपुट करने के लिए जिम्मेदार हैं। आउटपुट को सक्षम करने के लिए यहां कुछ विकल्प दिए गए हैं:- कैमरा एचएएल में प्रसंस्करण: आप
SurfaceOutputConfigImpl
कार्यान्वयन के साथ आउटपुट सतहों को सीधेCameraCaptureSession
में जोड़ सकते हैं। यह आपूर्ति की गई आउटपुट सतह को कैमरा पाइपलाइन में कॉन्फ़िगर करता है और कैमरा एचएएल को छवि को संसाधित करने की अनुमति देता है। मध्यवर्ती
ImageReader
सतह (RAW, YUV, आदि) को संसाधित करना:ImageReaderOutputConfigImpl
उदाहरण के साथCameraCaptureSession
में मध्यवर्तीImageReader
सतहों को जोड़ें।आपको मध्यवर्ती छवियों को संसाधित करने और परिणाम छवि को आउटपुट सतह पर लिखने की आवश्यकता है।
- कैमरा2 सतह साझाकरण का उपयोग करें: किसी अन्य
Camera2OutputConfigImpl
उदाहरण कीgetSurfaceSharingOutputConfigs()
विधि में कोई भी कैमराCamera2OutputConfigImpl
इंस्टेंस जोड़कर दूसरी सतह के साथ सतह साझाकरण का उपयोग करें। सतह का प्रारूप और आकार समान होना चाहिए।
SurfaceOutputConfigImpl
औरImageReaderOutputConfigImpl
सहित सभीCamera2OutputConfigImpl
OutputConfigImpl में एक अद्वितीय आईडी (getId()
) होनी चाहिए, जिसका उपयोग लक्ष्य सतह को निर्दिष्ट करने औरImageReaderOutputConfigImpl
से छवि पुनर्प्राप्त करने के लिए किया जाता है।-
onCaptureSessionStart
औरRequestProcessorImpl
जब
CameraCaptureSession
शुरू होता है और कैमरा फ्रेमवर्कonConfigured()
को आमंत्रित करता है, तो कैमरा2/एक्स कैमरा2 अनुरोध रैपरRequestProcessImpl
के साथSessionProcessorImpl.onCaptureSessionStart()
आमंत्रित करता है। कैमरा2/एक्सRequestProcessImpl
लागू करता है, जो आपको कैप्चर अनुरोधों को निष्पादित करने औरImageReaderOutputConfigImpl
का उपयोग करने पर छवियों को पुनर्प्राप्त करने में सक्षम बनाता है।अनुरोधों को निष्पादित करने के मामले में
RequestProcessImpl
एपीआई कैमरा2CameraCaptureSession
एपीआई के समान हैं। अंतर हैं:- लक्ष्य सतह को
Camera2OutputConfigImpl
इंस्टेंस की आईडी द्वारा निर्दिष्ट किया गया है। -
ImageReader
की छवि को पुनः प्राप्त करने की क्षमता।
आप छवियां प्राप्त करने के लिए
ImageProcessorImpl
इंस्टेंस को पंजीकृत करने के लिए एक निर्दिष्टCamera2OutputConfigImpl
आईडी के साथRequestProcessorImpl.setImageProcessor()
को कॉल कर सकते हैं।कैमरा2/X
SessionProcessorImpl.onCaptureSessionEnd()
कॉल करने के बादRequestProcessImpl
इंस्टेंस अमान्य हो जाता है।- लक्ष्य सतह को
पूर्वावलोकन प्रारंभ करें और एक चित्र लें
उन्नत एक्सटेंडर कार्यान्वयन में, आप
RequestProcessorImpl
इंटरफ़ेस के माध्यम से कैप्चर अनुरोध भेज सकते हैं। कैमरा2/एक्स आपको क्रमशःSessionProcessorImpl#startRepeating
औरSessionProcessorImpl#startCapture
कॉल करके पूर्वावलोकन या स्टिल कैप्चर अनुक्रम के लिए दोहराए जाने वाले अनुरोध को शुरू करने के लिए सूचित करता है। आपको इन पूर्वावलोकन और स्टिल-कैप्चर अनुरोधों को संतुष्ट करने के लिए कैप्चर अनुरोध भेजना चाहिए।कैमरा2/X
SessionProcessorImpl#setParameters
के माध्यम से कैप्चर अनुरोध पैरामीटर भी सेट करता है। आपको इन अनुरोध मापदंडों को दोहराए जाने वाले और एकल अनुरोधों दोनों पर सेट करना होगा (यदि पैरामीटर समर्थित हैं)।आपको कम से कम
CaptureRequest.JPEG_ORIENTATION
औरCaptureRequest.JPEG_QUALITY
का समर्थन करना होगा।extensions-interface
1.3.0 अनुरोध और परिणाम कुंजियों का समर्थन करता है, जिन्हें निम्नलिखित विधियों द्वारा उजागर किया जाता है:-
AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
-
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
जब डेवलपर्स
getAvailableCaptureRequestKeys
सूची में कुंजियाँ सेट करते हैं, तो आपको मापदंडों को सक्षम करना होगा और सुनिश्चित करना होगा कि कैप्चर परिणाम मेंgetAvailableCaptureResultKeys
सूची में कुंजियाँ शामिल हैं।-
startTrigger
CaptureRequest.CONTROL_AF_TRIGGER
औरCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
जैसे ट्रिगर शुरू करने के लिएSessionProcessorImpl.startTrigger()
को लागू किया जाता है। आप किसी भी कैप्चर अनुरोध कुंजियों को अनदेखा कर सकते हैं जिनकाAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
में विज्ञापन नहीं किया गया था।extensions-interface
1.3.0 के बाद सेstartTrigger()
समर्थन किया गया है। यह ऐप्स को एक्सटेंशन के साथ टैप-टू-फोकस और फ्लैश लागू करने में सक्षम बनाता है।साफ - सफाई
कैप्चर सत्र समाप्त करते समय,
CameraCaptureSession
बंद करने से पहलेSessionProcessorImpl.onCaptureSessionEnd()
को लागू किया जाता है। कैप्चर सत्र बंद होने के बाद,deInitSession()
सफ़ाई करता है।
पूर्वावलोकन, स्टिल कैप्चर और छवि विश्लेषण का समर्थन करें
आपको पूर्वावलोकन और स्टिल कैप्चर उपयोग के मामलों दोनों के लिए एक्सटेंशन लागू करना चाहिए। हालाँकि, यदि पूर्वावलोकन को आसानी से दिखाने के लिए विलंबता बहुत अधिक है, तो आप केवल स्टिल कैप्चर के लिए एक्सटेंशन लागू कर सकते हैं।
बेसिक एक्सटेंडर प्रकार के लिए, पूर्वावलोकन के लिए एक्सटेंशन को सक्षम करने के बावजूद, आपको किसी दिए गए एक्सटेंशन के लिए ImageCaptureExtenderImpl
और PreviewExtenderImpl
दोनों को लागू करना होगा। अक्सर, कोई ऐप छवि सामग्री का विश्लेषण करने जैसे क्यूआर कोड या टेक्स्ट ढूंढने के लिए YUV स्ट्रीम का भी उपयोग करता है। इस उपयोग के मामले में बेहतर समर्थन करने के लिए, आपको CameraCaptureSession
कॉन्फ़िगर करने के लिए पूर्वावलोकन, अभी भी कैप्चर, और एक YUV_420_888
स्ट्रीम के स्ट्रीम संयोजन का समर्थन करना चाहिए। इसका मतलब है कि यदि आप एक प्रोसेसर को लागू करते हैं, तो आपको तीन YUV_420_888
स्ट्रीम के स्ट्रीम संयोजन का समर्थन करना होगा।
उन्नत एक्सटेंडर के लिए, Camera2/X SessionProcessorImpl.initSession()
कॉल के लिए तीन आउटपुट सतहों को पास करता है। ये आउटपुट सतह क्रमशः पूर्वावलोकन, अभी भी कैप्चर और छवि विश्लेषण के लिए हैं। आपको यह सुनिश्चित करना चाहिए कि पूर्वावलोकन और अभी भी आउटपुट सतहों को कैप्चर करें वैध आउटपुट दिखाते हैं। हालांकि, छवि विश्लेषण आउटपुट सतह के लिए, यह सुनिश्चित करें कि यह केवल तब काम कर रहा है जब यह गैर-शून्य हो। यदि आपका कार्यान्वयन छवि विश्लेषण स्ट्रीम का समर्थन नहीं कर सकता है, तो आप AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
में एक खाली सूची वापस कर सकते हैं। यह सुनिश्चित करता है कि छवि विश्लेषण आउटपुट सतह हमेशा SessionProcessorImpl.initSession()
में शून्य है।
वीडियो कैप्चर का समर्थन करें
वर्तमान कैमरा एक्सटेंशन आर्किटेक्चर केवल पूर्वावलोकन का समर्थन करता है और अभी भी उपयोग के मामलों को कैप्चर करता है। हम वीडियो रिकॉर्ड करने के लिए MediaCodec
या MediaRecorder
सतहों पर एक्सटेंशन को सक्षम करने का समर्थन नहीं करते हैं। हालांकि, ऐप्स के लिए पूर्वावलोकन आउटपुट रिकॉर्ड करना संभव है।
MediaCodec
और MediaRecorder
सतहों का समर्थन करना जांच के दायरे में है।
एक्सटेंशन-विशिष्ट मेटाडेटा
Android 14 और उच्चतर के लिए, एक्सटेंशन-विशिष्ट मेटाडेटा कैमरा एक्सटेंशन क्लाइंट सेट करने और एक्सटेंशन विशिष्ट कैप्चर अनुरोध सेटिंग्स और परिणाम प्राप्त करने देता है। विशेष रूप से, कैमरा एक्सटेंशन क्लाइंट एक्सटेंशन की ताकत और EXTENSION_CURRENT_TYPE
कैप्चर परिणाम को नियंत्रित करने के लिए EXTENSION_STRENGTH
कैप्चर अनुरोध पैरामीटर का उपयोग कर सकते हैं ताकि सक्षम एक्सटेंशन प्रकार को इंगित किया जा सके।
अनुरोधों को कैप्चर करें
EXTENSION_STRENGTH
कैप्चर अनुरोध पैरामीटर एक्सटेंशन पोस्ट-प्रोसेसिंग प्रभाव की ताकत को नियंत्रित करता है। यदि यह पैरामीटर क्लाइंट द्वारा स्पष्ट रूप से सेट नहीं किया गया है, तो इसी कैप्चर परिणाम में डिफ़ॉल्ट शक्ति मान शामिल है। इस पैरामीटर को इन एक्सटेंशन प्रकारों के लिए निम्नानुसार लागू किया जा सकता है:
-
BOKEH
: धब्बा की मात्रा को नियंत्रित करता है। -
HDR
औरNIGHT
: फ्यूज्ड छवियों की मात्रा और अंतिम छवि की चमक को नियंत्रित करता है। -
FACE_RETOUCH
: कॉस्मेटिक एन्हांसमेंट और स्किन स्मूथिंग की मात्रा को नियंत्रित करता है।
EXTENSION_STRENGTH
पैरामीटर के लिए समर्थित रेंज 0
और 100
के बीच है, 0
कोई एक्सटेंशन प्रोसेसिंग या सिंपल पेस्ट्रू और 100
प्रोसेसिंग इफेक्ट की अधिकतम एक्सटेंशन स्ट्रेंथ को इंगित करता है।
EXTENSION_STRENGTH
के लिए समर्थन जोड़ने के लिए, एक्सटेंशन लाइब्रेरी इंटरफ़ेस के संस्करण 1.3.0 में शुरू किए गए विक्रेता विशिष्ट पैरामीटर एपीआई का उपयोग करें। अधिक जानकारी के लिए, getAvailableCaptureRequestKeys()
देखें।
परिणाम कैप्चर करें
EXTENSION_CURRENT_TYPE
कैप्चर परिणाम एक्सटेंशन कार्यान्वयन को सक्रिय एक्सटेंशन प्रकार के बारे में ग्राहकों को सूचित करने देता है।
क्योंकि AUTO
टाइप का उपयोग करने वाले एक्सटेंशन डायनामिक रूप से एक्सटेंशन प्रकार जैसे कि HDR
और NIGHT
बीच दृश्य स्थितियों के आधार पर स्विच करते हैं, कैमरा एक्सटेंशन ऐप्स AUTO
एक्सटेंशन द्वारा चयनित वर्तमान एक्सटेंशन के बारे में जानकारी प्रदर्शित करने के लिए EXTENSION_CURRENT_TYPE
उपयोग कर सकते हैं।
वास्तविक समय अभी भी विलंबता अनुमान को कैप्चर करता है
Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन क्लाइंट वास्तविक समय को क्वेरी कर सकते हैं, अभी भी getRealtimeStillCaptureLatency()
का उपयोग करके दृश्य और पर्यावरण की स्थिति के आधार पर विलंबता अनुमानों को कैप्चर कर सकते हैं। यह विधि स्थैतिक getEstimatedCaptureLatencyRangeMillis()
विधि की तुलना में अधिक सटीक अनुमान प्रदान करती है। विलंबता अनुमान के आधार पर, ऐप्स एक्सटेंशन प्रोसेसिंग को छोड़ने या लंबे समय तक चलने वाले ऑपरेशन के बारे में उपयोगकर्ताओं को सूचित करने के लिए एक संकेत प्रदर्शित करने का निर्णय ले सकते हैं।
CameraExtensionSession.StillCaptureLatency latency;
latency = extensionSession.getRealtimeStillCaptureLatency();
// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().
latency.getCaptureLatency();
// The processing latency from ExtensionCaptureCallback#onCaptureProcessStarted() until the processed frame returns to the client.
latency.getProcessingLatency();
वास्तविक समय का समर्थन करने के लिए अभी भी विलंबता अनुमानों को पकड़ने के लिए, निम्नलिखित को लागू करें:
- बुनियादी एक्सटेंशन:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- उन्नत एक्सटेंशन:
SessionProcessorImpl.getRealtimeCaptureLatency
प्रसंस्करण प्रगति कॉलबैक कैप्चर करें
Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन क्लाइंट लंबे समय तक चलने वाली अभी भी कैप्चर प्रोसेसिंग ऑपरेशन की प्रगति के लिए कॉलबैक प्राप्त कर सकते हैं। Apps समग्र उपयोगकर्ता अनुभव को बेहतर बनाने के लिए उपयोगकर्ताओं को वर्तमान प्रगति प्रदर्शित कर सकते हैं।
इस सुविधा को एकीकृत करने के लिए ऐप्स निम्न कोड का उपयोग कर सकते हैं:
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
कैप्चर प्रोसेसिंग प्रगति कॉलबैक का समर्थन करने के लिए, आपके एक्सटेंशन विक्रेता कार्यान्वयन को वर्तमान प्रगति मूल्य के साथ निम्नलिखित कॉलबैक को कॉल करना होगा:
- बुनियादी एक्सटेंशन:
ProcessResultImpl.onCaptureProcessProgressed()
- उन्नत एक्सटेंशन:
CaptureCallback.onCaptureProcessProgressed()
पोस्टव्यू अभी भी कैप्चर है
Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन setPostviewOutputConfiguration
का उपयोग करके एक पोस्टव्यू (पूर्वावलोकन छवि) की आपूर्ति कर सकता है। उपयोगकर्ता अनुभव को बेहतर बनाने के लिए, एप्स एक पोस्टव्यू छवि को एक प्लेसहोल्डर के रूप में प्रदर्शित कर सकते हैं जब एक एक्सटेंशन बढ़ा हुआ प्रसंस्करण विलंबता का अनुभव कर रहा है, और अंतिम छवि उपलब्ध होने पर छवि को बदलें। एप्लिकेशन निम्नलिखित संदर्भ कोड का उपयोग करके पोस्टव्यू कैप्चर अनुरोधों को कॉन्फ़िगर और जारी कर सकते हैं:
{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
extensionConfiguration.setPostviewOutputConfiguration(
postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);
CaptureRequest captureRequest = captureRequestBuilder.build();
…
}
पोस्टव्यू का समर्थन करने के लिए अभी भी कब्जा कर लिया गया है, आपके विक्रेता कार्यान्वयन को निम्नलिखित लागू करना होगा:
बुनियादी एक्सटेंशन:
CaptureProcessorImpl.onPostviewOutputSurface
औरCaptureProcessorImpl.processWithPostview
उन्नत एक्सटेंशन:
SessionProcessorImpl.startCaptureWithPostview
सरफेस व्यू आउटपुट का समर्थन करें
Android 14 और उच्चतर के लिए, कैमरा एक्सटेंशन क्लाइंट पावर और प्रदर्शन अनुकूलित पूर्वावलोकन रेंडर पथों का उपयोग कर सकते हैं, अनुरोधों को दोहराने के लिए पूर्वावलोकन आउटपुट के लिए एक SurfaceView
उदाहरण दर्ज करके।
SurfaceView
आउटपुट का समर्थन करने के लिए, आपके विक्रेता एक्सटेंशन कार्यान्वयन को SurfaceView
इंस्टेंस के लिए पूर्वावलोकन को स्ट्रीमिंग और आउटपुट करने में सक्षम होना चाहिए। यह सत्यापित करने के लिए कि यह समर्थित है, SurfaceViewExtensionPreviewTest.java
CTS मॉड्यूल को चलाएं।
विक्रेता विशिष्ट सत्र प्रकार
यह सुविधा विक्रेता एक्सटेंशन कार्यान्वयन को एक विक्रेता विशिष्ट सत्र प्रकार का चयन करने में सक्षम बनाता है जो डिफ़ॉल्ट मान के बजाय आंतरिक कैमरा कैप्चर सत्र में सेट किया जाएगा।
यह सुविधा पूरी तरह से फ्रेमवर्क और विक्रेता स्टैक के भीतर काम करती है और इसमें कोई ग्राहक/सार्वजनिक दृश्यमान एपीआई प्रभाव नहीं है।
एक विक्रेता-विशिष्ट सत्र प्रकार का चयन करने के लिए, अपने एक्सटेंशन लाइब्रेरीज़ के लिए निम्नलिखित को लागू करें: * ExtenderStateListener.onSessionType()
Camera2SessionConfigImpl.getSessionType()
बेसिक एक्सटेंशन के लिए
एक्सटेंशन इंटरफ़ेस संस्करण इतिहास
निम्न तालिका कैमरा एक्सटेंशन इंटरफ़ेस संस्करण इतिहास दिखाती है। आपको हमेशा नवीनतम संस्करण के साथ विक्रेता पुस्तकालय को लागू करना चाहिए।
संस्करण | सुविधाएँ जोड़ी गईं |
---|---|
1.0.0 |
|
1.1.0 |
|
1.2.0 |
|
1.3.0 |
|
1.4.0 |
|
संदर्भ कार्यान्वयन
निम्नलिखित संदर्भ OEM विक्रेता पुस्तकालय कार्यान्वयन frameworks/ex
में उपलब्ध हैं।
advancedSample
: उन्नत एक्सटेंडर का एक बुनियादी कार्यान्वयन।sample
: बुनियादी एक्सटेंडर का एक बुनियादी कार्यान्वयन।service_based_sample
: एक कार्यान्वयन जो किसीService
में कैमरा एक्सटेंशन की मेजबानी करने के लिए प्रदर्शित करता है। इस कार्यान्वयन में निम्नलिखित घटक शामिल हैं:oem_library
: कैमरा 2 और कैमरैक्स एक्सटेंशन एपीआई के लिए एक कैमरा एक्सटेंशन OEM लाइब्रेरी जोExtensions-Interface
लागू करता है। यह एक पकेथ के रूप में कार्य करता है जो आगे की ओरExtensions-Interface
से सेवा तक कॉल करता है। यह लाइब्रेरी सेवा के साथ संवाद करने के लिए Aidl फ़ाइलें और आवरण कक्षाएं भी प्रदान करती है।उन्नत एक्सटेंडर डिफ़ॉल्ट रूप से सक्षम है। बेसिक एक्सटेंडर को सक्षम करने के लिए,
ExtensionsVersionImpl#isAdvancedExtenderImplemented
कोfalse
वापस करने के लिए।extensions_service
: एक्सटेंशन सेवा का एक नमूना कार्यान्वयन। यहां अपना कार्यान्वयन जोड़ें। सेवा में लागू करने के लिए इंटरफ़ेसExtensions-Interface
के समान है। उदाहरण के लिए,IAdvancedExtenderImpl.Stub
लागू करनाAdvancedExtenderImpl
के समान संचालन करता है।ImageWrapper
औरTotalCaptureResultWrapper
Image
औरTotalCaptureResult
Parcelable बनाने की आवश्यकता है।
एक डिवाइस पर वेंडर लाइब्रेरी सेट करें
OEM वेंडर लाइब्रेरी को एक ऐप में नहीं बनाया गया है; यह डिवाइस से रनटाइम पर कैमरा 2/x द्वारा लोड किया गया है। कैमरैक्स में, <uses-library>
टैग यह घोषणा करता है कि androidx.camera.extensions.impl
लाइब्रेरी, जिसे camera-extensions
लाइब्रेरी की AndroidManifest.xml
फ़ाइल में परिभाषित किया गया है, कैमरैक्स की निर्भरता है और इसे रनटाइम पर लोड किया जाना चाहिए। कैमरा 2 में, फ्रेमवर्क एक एक्सटेंशन सेवा को लोड करता है जो यह भी घोषणा करता है कि <uses-library>
एक ही androidx.camera.extensions.impl
लाइब्रेरी को रनटाइम पर लोड करता है।
यह ओईएम विक्रेता लाइब्रेरी को स्वचालित रूप से लोड करने के लिए एक्सटेंशन का उपयोग करके तृतीय-पक्ष ऐप्स की अनुमति देता है। OEM लाइब्रेरी को वैकल्पिक के रूप में चिह्नित किया गया है ताकि ऐप्स उन उपकरणों पर चल सकें जिनके पास डिवाइस पर लाइब्रेरी नहीं है। Camera2/X इस व्यवहार को स्वचालित रूप से संभालता है जब कोई ऐप कैमरा एक्सटेंशन का उपयोग करने की कोशिश करता है जब तक कि डिवाइस निर्माता डिवाइस पर OEM लाइब्रेरी रखता है ताकि इसे ऐप द्वारा खोजा जा सके।
डिवाइस पर OEM लाइब्रेरी सेट करने के लिए, निम्नलिखित करें:
- एक अनुमति फ़ाइल जोड़ें, जो निम्न प्रारूप का उपयोग करके
<uses-library>
टैग द्वारा आवश्यक है:/etc/permissions/ ANY_FILENAME .xml
। उदाहरण के लिए,/etc/permissions/camera_extensions.xml
। इस निर्देशिका की फाइलें डिवाइस पर वास्तविक फ़ाइल पथ के लिए<uses-library>
में नामित लाइब्रेरी का एक मैपिंग प्रदान करती हैं। फ़ाइल में आवश्यक जानकारी जोड़ने के लिए नीचे दिए गए उदाहरण का उपयोग करें।
-
name
androidx.camera.extensions.impl
होना चाहिए क्योंकि यह वह पुस्तकालय है जिसे कैमरैक्स खोजता है। -
file
उस फ़ाइल का निरपेक्ष पथ है जिसमें एक्सटेंशन कार्यान्वयन (उदाहरण के लिए,/system/framework/androidx.camera.extensions.impl.jar
androidx.camera.extensions.impl.jar) होता है।
<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="androidx.camera.extensions.impl" file="OEM_IMPLEMENTED_JAR" /> </permissions>
-
Android 12 या उससे अधिक में, कैमरैक्स एक्सटेंशन का समर्थन करने वाले उपकरणों में ro.camerax.extensions.enabled
प्रॉपर्टी को true
पर सेट किया जाना चाहिए, जो क्वेरी करने की अनुमति देता है कि क्या कोई डिवाइस एक्सटेंशन का समर्थन करता है। ऐसा करने के लिए, डिवाइस मेक फ़ाइल में निम्न पंक्ति जोड़ें:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
मान्यकरण
विकास चरण के दौरान OEM विक्रेता लाइब्रेरी के अपने कार्यान्वयन का परीक्षण करने के लिए, androidx-main/camera/integration-tests/extensionstestapp/
पर उदाहरण ऐप का उपयोग करें, जो विभिन्न विक्रेता एक्सटेंशन के माध्यम से चलता है।
अपने कार्यान्वयन को पूरा करने के बाद, यह सत्यापित करने के लिए स्वचालित और मैनुअल परीक्षण चलाने के लिए कैमरा एक्सटेंशन सत्यापन टूल का उपयोग करें कि विक्रेता पुस्तकालय सही तरीके से लागू किया गया है।
विस्तारित दृश्य मोड बनाम कैमरा एक्सटेंशन
बोकेह एक्सटेंशन के लिए, कैमरा एक्सटेंशन का उपयोग करके इसे उजागर करने के अलावा, आप विस्तारित दृश्य मोड का उपयोग करके एक्सटेंशन को उजागर कर सकते हैं, जो कि CONTROL_EXTENDED_SCENE_MODE
key के माध्यम से सक्षम है। अधिक कार्यान्वयन विवरण के लिए, कैमरा बोकेह देखें।
विस्तारित दृश्य मोड में कैमरा 2 ऐप के लिए कैमरा एक्सटेंशन की तुलना में कम प्रतिबंध हैं। उदाहरण के लिए, आप एक नियमित CameraCaptureSession
इंस्टेंस में विस्तारित दृश्य मोड को सक्षम कर सकते हैं जो लचीले स्ट्रीम संयोजनों का समर्थन करता है और अनुरोध मापदंडों को कैप्चर करता है। इसके विपरीत, कैमरा एक्सटेंशन केवल स्ट्रीम प्रकारों के एक निश्चित सेट का समर्थन करते हैं और कैप्चर अनुरोध मापदंडों के लिए सीमित समर्थन रखते हैं।
विस्तारित दृश्य मोड का एक नकारात्मक पक्ष यह है कि आप इसे केवल कैमरा एचएएल में लागू कर सकते हैं, जिसका अर्थ है कि इसे ऐप डेवलपर्स के लिए उपलब्ध सभी ऑर्थोगोनल नियंत्रणों में काम करने के लिए सत्यापित किया जाना चाहिए।
हम विस्तारित दृश्य मोड और कैमरा एक्सटेंशन दोनों का उपयोग करके बोकेह को उजागर करने की सलाह देते हैं क्योंकि एप्स बोकेह को सक्षम करने के लिए एक विशेष एपीआई का उपयोग करना पसंद कर सकते हैं। हम पहले विस्तारित दृश्य मोड का उपयोग करने की सलाह देते हैं क्योंकि यह बोकेह एक्सटेंशन को सक्षम करने के लिए ऐप्स के लिए सबसे लचीला तरीका है। फिर आप विस्तारित दृश्य मोड के आधार पर कैमरा एक्सटेंशन इंटरफ़ेस को लागू कर सकते हैं। यदि कैमरा एचएएल में बोकेह को लागू करना मुश्किल है, उदाहरण के लिए, क्योंकि इसके लिए छवियों को संसाधित करने के लिए ऐप लेयर में चलने वाले पोस्ट प्रोसेसर की आवश्यकता होती है, तो हम कैमरा एक्सटेंशन इंटरफ़ेस का उपयोग करके बोकेह एक्सटेंशन को लागू करने की सलाह देते हैं।
अक्सर पूछे जाने वाले प्रश्न (एफएक्यू)
क्या एपीआई स्तरों पर कोई प्रतिबंध है?
हाँ। यह Android API फ़ीचर सेट पर निर्भर करता है जो OEM विक्रेता लाइब्रेरी कार्यान्वयन द्वारा आवश्यक है। उदाहरण के लिए, ExtenderStateListener.onPresetSession()
SessionConfiguration.setSessionParameters()
कॉल का एक बेसलाइन सेट सेट करने के लिए कॉल करें। यह कॉल केवल एपीआई स्तर 28 और उच्चतर पर उपलब्ध है। विशिष्ट इंटरफ़ेस विधियों के विवरण के लिए, एपीआई संदर्भ प्रलेखन देखें।