डिवाइस बनाने वाली कंपनियां, तीसरे पक्ष के डेवलपर को बोकेह, नाइट मोड, और एचडीआर जैसे एक्सटेंशन ऐक्सेस करने की अनुमति दे सकती हैं. इसके लिए, वे OEM वेंडर लाइब्रेरी से मिले कैमरा एक्सटेंशन इंटरफ़ेस का इस्तेमाल करती हैं. OEM वेंडर लाइब्रेरी में लागू किए गए एक्सटेंशन को ऐक्सेस करने के लिए, डेवलपर Camera2 एक्सटेंशन एपीआई और CameraX एक्सटेंशन एपीआई का इस्तेमाल कर सकते हैं.
इस्तेमाल किए जा सकने वाले एक्सटेंशन की सूची देखने के लिए, जो Camera2 और CameraX में एक जैसे होते हैं, कैमराX एक्सटेंशन एपीआई देखें. अगर आपको कोई एक्सटेंशन जोड़ना है, तो समस्या ट्रैकर पर गड़बड़ी की शिकायत करें.
इस पेज पर, डिवाइसों पर OEM वेंडर लाइब्रेरी को लागू करने और चालू करने का तरीका बताया गया है.
भवन निर्माण
इस डायग्राम में, Camera Extensions इंटरफ़ेस या extensions-interface
के आर्किटेक्चर के बारे में बताया गया है:
पहली इमेज. Camera Extensions के आर्किटेक्चर का डायग्राम
जैसा कि डायग्राम में दिखाया गया है, कैमरा एक्सटेंशन की सुविधा के लिए, आपको OEM वेंडर लाइब्रेरी से मिले extensions-interface
को लागू करना होगा. आपकी OEM वेंडर लाइब्रेरी, दो एपीआई चालू करती है:
CameraX एक्सटेंशन एपीआई और
Camera2 एक्सटेंशन एपीआई.
वेंडर एक्सटेंशन को ऐक्सेस करने के लिए, CameraX और Camera2 ऐप्लिकेशन इनका इस्तेमाल करते हैं.
OEM वेंडर लाइब्रेरी लागू करना
OEM वेंडर लाइब्रेरी को लागू करने के लिए, camera-extensions-stub
फ़ाइलों को सिस्टम लाइब्रेरी प्रोजेक्ट में कॉपी करें. ये फ़ाइलें, Camera Extensions के इंटरफ़ेस के बारे में बताती हैं.
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()
को सेट करें या इससे जुड़ी एक्सटेंडर क्लास हटाएं. Camera2 और CameraX एक्सटेंशन के एपीआई, ऐप्लिकेशन को बताते हैं कि एक्सटेंशन उपलब्ध नहीं है.
आइए, यह जानें कि एक्सटेंशन चालू करने के लिए, Camera2 और CameraX एक्सटेंशन एपीआई, वेंडर लाइब्रेरी के साथ कैसे इंटरैक्ट करते हैं. यहां दिए गए डायग्राम में, उदाहरण के तौर पर Night एक्सटेंशन का इस्तेमाल करके, एंड-टू-एंड फ़्लो दिखाया गया है:
दूसरी इमेज. नाइट एक्सटेंशन लागू करना
वर्शन की पुष्टि करना:
Camera2/X,
ExtensionVersionImpl.checkApiVersion()
को कॉल करता है, ताकि यह पक्का किया जा सके कि OEM के लागू किए गएextensions-interface
वर्शन, Camera2/X के साथ काम करने वाले वर्शन के साथ काम करता हो.वेंडर लाइब्रेरी शुरू करना:
InitializerImpl
में एक तरीकाinit()
है, जो वेंडर लाइब्रेरी को शुरू करता है. Camera2/X, एक्सटेंडर क्लास को ऐक्सेस करने से पहले, इनिशलाइज़ेशन पूरा करता है.एक्सटेंडर क्लास को तुरंत लागू करना:
एक्सटेंशन के लिए एक्सटेंडर क्लास इंस्टैंशिएट करता है. एक्सटेंडर दो तरह के होते हैं: बेसिक एक्सटेंडर और ऐडवांस एक्सटेंडर. आपको सभी एक्सटेंशन के लिए, एक तरह का एक्सटेंडर लागू करना होगा. ज़्यादा जानकारी के लिए, बेसिक एक्सटेंडर बनाम ऐडवांस एक्सटेंडर देखें.
Camera2/X, जानकारी पाने और एक्सटेंशन चालू करने के लिए, Extender क्लास को इंस्टैंशिएट करता है और उनसे इंटरैक्ट करता है. किसी एक्सटेंशन के लिए, Camera2/X कई बार एक्सटेंडर क्लास को इंस्टैंशिएट कर सकता है. इसलिए, कंस्ट्रक्टर या
init()
कॉल में, ज़्यादा काम का शुरूआती कोड न डालें. कैमरा सेशन शुरू होने पर ही, ज़्यादा काम करें. जैसे, जब बुनियादी एक्सटेंडर मेंonInit()
या ऐडवांस एक्सटेंडर मेंinitSession()
को कॉल किया जाता है.नाइट एक्सटेंशन के लिए, बुनियादी एक्सटेंडर टाइप के लिए, इन एक्सटेंडर क्लास का इस्तेमाल किया जाता है:
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
और ऐडवांस एक्सटेंडर टाइप के लिए:
NightAdvancedExtenderImpl.java
समयसीमा बढ़ाने की सुविधा उपलब्ध है या नहीं, यह देखना:
एक्सटेंशन चालू करने से पहले,
isExtensionAvailable()
यह जांच करता है कि एक्सटेंशन, एक्सटेंडर इंस्टेंस के ज़रिए बताए गए कैमरा आईडी पर उपलब्ध है या नहीं.कैमरे की जानकारी के साथ एक्सटेंडर को शुरू करना:
Camera2/X, एक्सटेंडर इंस्टेंस पर
init()
को कॉल करता है और उसे कैमरा आईडी औरCameraCharacteristics
भेजता है.क्वेरी की जानकारी:
यह एक्सटेंडर क्लास को कॉल करता है, ताकि काम करने वाले रिज़ॉल्यूशन जैसी जानकारी हासिल की जा सके. साथ ही, अनुमानित इंतज़ार का समय कैप्चर किया जा सके और एक्सटेंशन चालू करने की तैयारी के लिए, एक्सटेंडर से अनुरोध कुंजियां कैप्चर की जा सकें.
एक्सटेंडर पर एक्सटेंशन चालू करें:
Extender क्लास, क्लास को चालू करने के लिए ज़रूरी सभी इंटरफ़ेस उपलब्ध कराती है. यह OEM को Camera2 पाइपलाइन में लागू करने का तरीका उपलब्ध कराता है. जैसे, कैप्चर रिक्वेस्ट पैरामीटर को इंजेक्ट करना या पोस्ट प्रोसेसर को चालू करना.
ऐडवांस एक्सटेंडर टाइप के लिए, Camera2/X एक्सटेंशन को चालू करने के लिए
SessionProcessorImpl
से इंटरैक्ट करता है. Camera2/X, एक्सटेंडर परcreateSessionProcessor()
को कॉल करकेSessionProcessorImpl
इंस्टेंस को वापस लाता है.
इन सेक्शन में, एक्सटेंशन फ़्लो के बारे में ज़्यादा जानकारी दी गई है.
वर्शन की पुष्टि करना
रनटाइम के दौरान डिवाइस से OEM वेंडर लाइब्रेरी लोड करते समय, Camera2/X यह पुष्टि करता है कि लाइब्रेरी, extensions-interface
वर्शन के साथ काम करती है या नहीं.
extensions-interface
, सिमेंटिक वर्शनिंग या
MAJOR.MINOR.PATCH का इस्तेमाल करता है. उदाहरण के लिए, 1.1.0 या 1.2.0. हालांकि, वर्शन की पुष्टि के दौरान सिर्फ़ मुख्य और मामूली वर्शन का इस्तेमाल किया जाता है.
वर्शन की पुष्टि करने के लिए, Camera2/X, इसके साथ काम करने वाले extensions-interface
वर्शन का इस्तेमाल करके ExtensionVersionImpl.checkApiVersion()
को कॉल करता है. इसके बाद, Camera2/X, OEM लाइब्रेरी के बताए गए वर्शन का इस्तेमाल करके यह तय करता है कि एक्सटेंशन को चालू किया जा सकता है या नहीं. साथ ही, यह भी तय करता है कि उसे कौनसी सुविधाएं चालू करनी चाहिए.
मेजर वर्शन के साथ काम करना
अगर Camera2/X और वेंडर लाइब्रेरी के बीच, एक्सटेंशन-इंटरफ़ेस के मुख्य वर्शन अलग-अलग हैं, तो इसे काम न करने वाला माना जाता है और एक्सटेंशन बंद कर दिया जाता है.
पुराने सिस्टम के साथ काम करने की सुविधा
जब तक मुख्य वर्शन एक जैसा है, तब तक Camera2/X यह पक्का करता है कि extensions-interface
के पुराने वर्शन के साथ बनाई गई OEM वेंडर लाइब्रेरी के साथ पिछले वर्शन के साथ काम करने की सुविधा उपलब्ध हो. उदाहरण के लिए, अगर Camera2/X, extensions-interface
1.3.0 के साथ काम करता है, तो 1.0.0, 1.1.0, और 1.2.0 को लागू करने वाली OEM वेंडर लाइब्रेरी पर अब भी काम किया जा सकता है. इसका यह भी मतलब है कि वेंडर लाइब्रेरी के किसी खास वर्शन को लागू करने के बाद, Camera2/X यह पक्का करता है कि लाइब्रेरी, आने वाले समय में रिलीज़ होने वाले extension-interface
वर्शन के साथ काम करती रहे.
नए सिस्टम के साथ काम करने की सुविधा
नए extensions-interface
की वेंडर लाइब्रेरी के साथ फ़ॉरवर्ड काम करने की सुविधा, आप पर निर्भर करती है, यानी OEM. अगर आपको एक्सटेंशन लागू करने के लिए कुछ सुविधाओं की ज़रूरत है, तो हो सकता है कि आप किसी खास वर्शन से एक्सटेंशन चालू करना चाहें. इस मामले में, Camera2/X लाइब्रेरी का वर्शन ज़रूरी शर्तें पूरी करने पर, काम करने वाला extensions-interface
वर्शन दिखाया जा सकता है. अगर Camera2/X वर्शन काम नहीं करते हैं, तो एक्सटेंशन बंद करने के लिए, काम न करने वाले वर्शन को वापस लाया जा सकता है. जैसे, 99.0.0.
वेंडर लाइब्रेरी को शुरू करना
OEM लाइब्रेरी के लागू किए गए extensions-interface
वर्शन की पुष्टि करने के बाद, Camera2/X, शुरू करने की प्रोसेस शुरू करता है. InitializerImpl.init()
तरीका, OEM लाइब्रेरी को यह सिग्नल देता है कि कोई ऐप्लिकेशन एक्सटेंशन का इस्तेमाल करने की कोशिश कर रहा है.
Camera2/X, वर्शन की जांच के अलावा OEM लाइब्रेरी को कोई और कॉल तब तक नहीं करता, जब तक OEM वेंडर लाइब्रेरी, शुरू करने की प्रोसेस पूरी होने की सूचना देने के लिए OnExtensionsInitializedCallback.onSuccess()
को कॉल नहीं करती.
आपको extensions-interface
1.1.0 के तौर पर,
InitializerImpl
लागू करना होगा. अगर OEM वेंडर लाइब्रेरी में extensions-interface
1.0.0 लागू किया जाता है, तो Camera2/X लाइब्रेरी को शुरू करने के चरण को छोड़ देता है.
बेसिक एक्सटेंडर बनाम ऐडवांस एक्सटेंडर
extensions-interface
को लागू करने के दो तरीके हैं: बेसिक एक्सटेंडर और ऐडवांस एक्सटेंडर. ऐडवांस एक्सटेंडर,
extensions-interface
1.2.0 से काम कर रहा है.
ऐसे एक्सटेंशन के लिए बेसिक एक्सटेंडर लागू करें जो कैमरा एचएएल में इमेज प्रोसेस करते हैं या YUV स्ट्रीम प्रोसेस करने वाले पोस्ट प्रोसेसर का इस्तेमाल करते हैं.
उन एक्सटेंशन के लिए बेहतर एक्सटेंडर लागू करें जिन्हें Camera2 के स्ट्रीम कॉन्फ़िगरेशन को पसंद के मुताबिक बनाने और ज़रूरत के हिसाब से कैप्चर करने के अनुरोध भेजने की ज़रूरत है.
तुलना के लिए, नीचे दी गई टेबल देखें:
बुनियादी एक्सटेंडर | ऐडवांस एक्सटेंडर | |
---|---|---|
स्ट्रीम कॉन्फ़िगरेशन | ठीक किया गया झलक: PRIVATE या YUV_420_888 (अगर प्रोसेसर मौजूद है) स्टिल कैप्चर: JPEG या YUV_420_888 (अगर प्रोसेसर मौजूद है)
|
OEM के हिसाब से पसंद के मुताबिक बनाया जा सकता है. |
कैप्चर करने का अनुरोध भेजा जा रहा है | सिर्फ़ Camera2/X, कैप्चर करने के अनुरोध भेज सकता है. इन अनुरोधों के लिए, पैरामीटर सेट किए जा सकते हैं. इमेज कैप्चर करने के लिए प्रोसेसर दिए जाने पर, Camera2/X कैप्चर करने के कई अनुरोध भेज सकता है. साथ ही, सभी इमेज भेज सकता है और प्रोसेसर को नतीजे कैप्चर कर सकता है. | आपको RequestProcessorImpl इंस्टेंस दिया जाता है, ताकि आप
camera2 capture अनुरोध को पूरा कर सकें और नतीजे और इमेज पा सकें.
Camera2/X, |
कैमरा पाइपलाइन में हुक |
|
|
इनके लिए सही है | कैमरा एचएएल या प्रोसेसर में लागू किए गए ऐसे एक्सटेंशन जो YUV इमेज को प्रोसेस करते हैं. |
|
साथ काम करने वाले एपीआई का वर्शन | Camera2 एक्सटेंशन: Android 13 या उसके बाद के वर्शन CameraX एक्सटेंशन: camera-extensions 1.1.0 या इसके बाद के वर्शन |
Camera2 एक्सटेंशन: Android 12L या इसके बाद का वर्शन CameraX एक्सटेंशन: camera-extensions 1.2.0-alpha03 या इसके बाद का वर्शन |
ऐप्लिकेशन फ़्लो
नीचे दी गई टेबल में तीन तरह के ऐप्लिकेशन फ़्लो और उनसे जुड़े कैमरा एक्सटेंशन एपीआई कॉल दिखाए गए हैं. Camera2/X में ये एपीआई उपलब्ध होते हैं. हालांकि, इन फ़्लो के साथ काम करने के लिए, आपको वेंडर लाइब्रेरी को सही तरीके से लागू करना होगा. इस बारे में हम आगे के सेक्शन में ज़्यादा जानकारी देंगे.
Camera2 एक्सटेंशन | CameraX एक्सटेंशन | |
---|---|---|
क्वेरी एक्सटेंशन की उपलब्धता के बारे में जानकारी | CameraExtensionCharacteristics
.getSupportedExtensions
|
ExtensionsManager.
isExtensionAvailable
|
क्वेरी की जानकारी | CameraExtensionCharacteristics.
getExtensionSupportedSizes
CameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillis
CameraExtensionCharacteristics.
getAvailableCaptureRequestKeys
CameraExtensionCharacteristics.
getAvailableCaptureResultKeys
|
ExtensionsManager.
getEstimatedCaptureLatencyRange
लाइब्रेरी में बाकी जानकारी को CameraX मैनेज करता है. |
एक्सटेंशन चालू होने पर, झलक देखें और फ़ोटो या वीडियो को स्टिल-कैप्चर करें | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
बुनियादी एक्सटेंडर
बेसिक एक्सटेंडर इंटरफ़ेस, कैमरे की प्रोसेसिंग की प्रोसेस में कई जगहों पर हुक उपलब्ध कराता है. हर तरह के एक्सटेंशन के लिए, एक्सटेंडर क्लास होती हैं. OEM को इन्हें लागू करना होता है.
नीचे दी गई टेबल में, एक्सटेंडर क्लास की सूची दी गई है. OEM को हर एक्सटेंशन के लिए इन्हें लागू करना होगा:
लागू करने के लिए एक्सटेंडर क्लास | |
---|---|
रात | NightPreviewExtenderImpl.java
|
एचडीआर | HdrPreviewExtenderImpl.java
|
अपने-आप | AutoPreviewExtenderImpl.java
|
बोकेह | BokehPreviewExtenderImpl.java
|
चेहरे की फ़ोटो क्वालिटी में सुधार | BeautyPreviewExtenderImpl.java
|
हमने नीचे दिए गए उदाहरण में, प्लेसहोल्डर के तौर पर PreviewExtenderImpl
और ImageCaptureExtenderImpl
का इस्तेमाल किया है. इन नामों को उन असल फ़ाइलों के नाम से बदलें जिन्हें लागू किया जा रहा है.
बुनियादी एक्सटेंडर में ये सुविधाएं होती हैं:
CameraCaptureSession
(onPresetSession
) को कॉन्फ़िगर करते समय, सेशन पैरामीटर इंजेक्ट करें.- कैप्चर सेशन के शुरू और बंद होने की सूचना देता है. साथ ही, लौटाए गए पैरामीटर (
onEnableSession
,onDisableSession
) के साथ एचएएल को सूचित करने के लिए सिर्फ़ एक अनुरोध भेजता है. - अनुरोध के लिए कैप्चर पैरामीटर डालें (
PreviewExtenderImpl.getCaptureStage
,ImageCaptureExtenderImpl.getCaptureStages
). - झलक देखने और फ़ोटो खींचने के लिए प्रोसेसर जोड़ें, जो
YUV_420_888
स्ट्रीम को प्रोसेस कर सके.
आइए, देखें कि ऊपर बताए गए तीन ऐप्लिकेशन फ़्लो को पूरा करने के लिए, Camera2/X extensions-interface
को कैसे इस्तेमाल करता है.
ऐप्लिकेशन फ़्लो 1: एक्सटेंशन की उपलब्धता की जांच करना
तीसरी इमेज. बुनियादी एक्सटेंडर पर ऐप्लिकेशन का फ़्लो 1
इस फ़्लो में, Camera2/X सीधे PreviewExtenderImpl
और ImageCaptureExtenderImpl
, दोनों के isExtensionAvailable()
तरीके को कॉल करता है. इसके लिए, init()
को कॉल नहीं किया जाता. एक्सटेंशन चालू करने के लिए, दोनों एक्सटेंडर क्लास को true
दिखाना होगा.
आम तौर पर, ऐप्लिकेशन इस बात की जांच करने के लिए, सबसे पहले यह देखते हैं कि किसी कैमरा आईडी के लिए, एक्सटेंशन का दिया गया टाइप काम करता है या नहीं. इसके बाद ही, वे एक्सटेंशन को चालू करते हैं. ऐसा इसलिए है, क्योंकि कुछ एक्सटेंशन सिर्फ़ कुछ कैमरा आईडी पर काम करते हैं.
ऐप्लिकेशन का दूसरा फ़्लो: क्वेरी की जानकारी
चौथी इमेज. बेसिक एक्सटेंडर पर ऐप्लिकेशन फ़्लो 2
यह पता लगाने के बाद कि एक्सटेंशन उपलब्ध है या नहीं, एक्सटेंशन को चालू करने से पहले ऐप्लिकेशन को इन जानकारी के लिए क्वेरी करनी चाहिए.
स्टिल कैप्चर में लगने वाला समय:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
, ऐप्लिकेशन के लिए कैप्चर में लगने वाले समय की रेंज दिखाता है. इससे यह पता चलता है कि मौजूदा स्थिति के लिए, एक्सटेंशन चालू करना सही है या नहीं.झलक और कैप्चर किए गए प्लैटफ़ॉर्म के लिए इस्तेमाल किए जा सकने वाले साइज़:
ImageCaptureExtenderImpl.getSupportedResolutions
औरPreviewExtenderImpl.getSupportedResolutions
, इमेज फ़ॉर्मैट और साइज़ की सूची दिखाते हैं. ये साइज़, प्लैटफ़ॉर्म के फ़ॉर्मैट और साइज़ के साथ काम करते हैं.इस्तेमाल किए जा सकने वाले अनुरोध और नतीजे दिखाने वाली कुंजियां: कैमरा2/X में, ये तरीके अपनाए जा सकते हैं. ऐसा करने पर, कैप्चर करने के अनुरोध से जुड़ी कुंजियों और नतीजे दिखाने वाली कुंजियों को वापस लाया जा सकता है. इसके लिए:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
ज़्यादा जानकारी के लिए क्वेरी करने से पहले, Camera2/X हमेशा इन एक्सटेंडर क्लास पर पहले init()
को कॉल करता है.
ऐप्लिकेशन फ़्लो 3: एक्सटेंशन चालू होने पर झलक देखना/स्टिल कैप्चर करना (एचएएल लागू करना)
पांचवीं इमेज. बुनियादी एक्सटेंडर पर ऐप्लिकेशन का फ़्लो 3
ऊपर दिए गए डायग्राम में, प्रोसेसर के बिना एक्सटेंशन की मदद से, झलक देखने और फ़ोटो खींचने की सुविधा चालू करने के मुख्य फ़्लो को दिखाया गया है. इसका मतलब है कि कैमरा एचएएल, एक्सटेंशन को प्रोसेस करता है.
इस फ़्लो में, Camera2/X पहले init()
को कॉल करता है और फिर onInit
को कॉल करता है. इससे आपको यह सूचना मिलती है कि तय किए गए एक्सटेंशन के साथ कैमरा सेशन शुरू होने वाला है.
onInit()
में, भारी-भरकम शुरुआत की जा सकती है.
CameraCaptureSession
को कॉन्फ़िगर करते समय, Camera2/X सेशन पैरामीटर पाने के लिए onPresetSession
को शुरू करता है. कैप्चर सेशन को कॉन्फ़िगर करने के बाद, Camera2/X onEnableSession
को शुरू करता है. इससे CaptureStageImpl
का एक इंस्टेंस मिलता है, जिसमें कैप्चर पैरामीटर होते हैं. Camera2/X, कैप्चर पैरामीटर के साथ तुरंत एक अनुरोध भेजता है, ताकि एचएएल को सूचना दी जा सके. इसी तरह, कैप्चर सेशन बंद होने से पहले, Camera2/X, onDisableSession
को शुरू करता है. इसके बाद, कैप्चर के लिए मिले पैरामीटर के साथ एक अनुरोध भेजता है.
Camera2/X से किए गए बार-बार होने वाले अनुरोध में, PreviewExtenderImpl.getCaptureStage()
से मिले अनुरोध के पैरामीटर शामिल होते हैं. इसके अलावा, स्टिल कैप्चर के अनुरोध में ImageCaptureExtenderImpl.getCaptureStages()
से मिले पैरामीटर शामिल होते हैं.
आखिर में, कैमरा सेशन खत्म होने के बाद Camera2/X onDeInit()
शुरू करता है.
onDeinit()
में जाकर, संसाधनों को रिलीज़ किया जा सकता है.
झलक दिखाने वाला प्रोसेसर
कैमरा एचएएल के अलावा, प्रोसेसर में भी एक्सटेंशन लागू किए जा सकते हैं.
PreviewExtenderImpl.getProcessorType
को लागू करें, ताकि प्रोसेसर का टाइप तय किया जा सके. इसके बारे में नीचे बताया गया है:
PROCESSOR_TYPE_NONE
: कोई प्रोसेसर नहीं. इमेज को कैमरे के एचएएल में प्रोसेस किया जाता है.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
फ़ॉर्मैट में लिखना चाहिए. Camera2/X, झलक देखने के लिएCameraCaptureSession
को कॉन्फ़िगर करने के लिए,PRIVATE
के बजायYUV_420_888
के प्लैटफ़ॉर्म का इस्तेमाल करता है.फ़्लो के बारे में जानने के लिए, यह इलस्ट्रेशन देखें:
छठी इमेज. 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
प्लैटफ़ॉर्म पर आउटपुट को लिखने की ज़िम्मेदारी प्रोसेसर की होती है.
स्टिल कैप्चर का अनुरोध भेजने से पहले, यह माना जा सकता है कि झलक देखने की सुविधा चालू है और वह काम कर रही है.
नीचे दिए गए डायग्राम में फ़्लो देखें:
सातवीं इमेज. अब भी CaptureProcessorImpl
से फ़्लो कैप्चर करें
कैप्चर किए जा रहे सेशन को कॉन्फ़िगर करने के लिए, Camera2/X
YUV_420_888
फ़ॉर्मैट प्लैटफ़ॉर्म का इस्तेमाल करता है. Camera2/X,CaptureProcessorImpl
को तैयार करने के लिए इन फ़ंक्शन को कॉल करता है:CaptureProcessorImpl.onImageFormatUpdate()
मेंYUV_420_888
.CaptureProcessorImpl.onResolutionUpdate()
के साथ इनपुट इमेज का साइज़ डालें.CaptureProcessorImpl.onOutputSurface()
, जिसमें आउटपुटYUV_420_888
सतह हो.
ImageCaptureExtenderImpl.getCaptureStages
,CaptureStageImpl
की सूची दिखाता है. इसमें हर एलिमेंट, कैप्चर पैरामीटर के साथCaptureRequest
इंस्टेंस पर मैप होता है. ये पैरामीटर, Camera2/X से भेजे जाते हैं. उदाहरण के लिए, अगर यह तीनCaptureStageImpl
इंस्टेंस की सूची दिखाता है, तो Camera2/XcaptureBurst
एपीआई का इस्तेमाल करके, कैप्चर पैरामीटर के साथ कैप्चर करने के तीन अनुरोध भेजता है.मिली इमेज और
TotalCaptureResult
इंस्टेंस को एक साथ बंडल किया जाता है और प्रोसेस करने के लिएCaptureProcessorImpl
को भेजा जाता है.CaptureProcessorImpl
,onOutputSurface()
कॉल से तय किए गए आउटपुट प्लैटफ़ॉर्म पर नतीजे की इमेज (YUV_420_888
फ़ॉर्मैट) लिखता है. ज़रूरत पड़ने पर, Camera2/X इसे JPEG इमेज में बदल देता है.
अनुरोध कुंजियों और नतीजों को कैप्चर करने की सुविधा
कैमरे की झलक देखने और फ़ोटो खींचने के अलावा, ऐप्लिकेशन ज़ूम, फ़्लैश पैरामीटर सेट कर सकते हैं या टैप-टू-फ़ोकस को ट्रिगर कर सकते हैं. ऐसा हो सकता है कि ये पैरामीटर, आपके एक्सटेंशन के लागू होने के साथ काम न करें.
extensions-interface
1.3.0 में ये तरीके जोड़े गए हैं, ताकि आप लागू किए जा सकने वाले पैरामीटर दिखा सकें:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
, कैप्चर करने के लिए अनुरोध की उन कुंजियों की जानकारी देता है जो आपके लागू किए गए तरीके के साथ काम करती हैं.ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
, कैप्चर किए गए नतीजे में मौजूद कैप्चर कीवर्ड दिखाता है.
अगर कैमरा एचएएल, एक्सटेंशन को प्रोसेस करता है, तो Camera2/X CameraCaptureSession.CaptureCallback
में कैप्चर किए गए नतीजों को हासिल कर लेता है. हालांकि, अगर प्रोसेसर लागू किया जाता है, तो Camera2/X, कैप्चर किए गए नतीजों को ProcessResultImpl
में वापस लाता है. इसे PreviewImageProcessorImpl
और CaptureProcessorImpl
में process()
तरीके से पास किया जाता है.
ProcessResultImpl
की मदद से कैप्चर किए गए इमेज के नतीजे को Camera2/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 या उससे पहले के वर्शन लागू करने वाले बेसिक एक्सटेंडर के लिए, CameraX
एक्सटेंशन एपीआई ऊपर दी गई सभी कुंजियों के साथ काम करता है. extensions-interface
1.3.0 के लिए, CameraX और Camera2, रिटर्न की गई सूची का इस्तेमाल करते हैं और उसमें मौजूद सिर्फ़ कुंजियों के साथ काम करते हैं. उदाहरण के लिए, अगर 1.3.0 में सिर्फ़ CaptureRequest#CONTROL_ZOOM_RATIO
और CaptureRequest#SCALER_CROP_REGION
दिखाने का फ़ैसला लिया जाता है, तो इसका मतलब है कि ऐप्लिकेशन पर सिर्फ़ ज़ूम की सुविधा काम करती है. हालांकि, टैप-टू-फ़ोकस, फ़्लैश, और एक्सपोज़र से जुड़े मुआवज़े की अनुमति नहीं है.
ऐडवांस एक्सटेंडर
बेहतर एक्सटेंडर, Camera2 API पर आधारित वेंडर लागू करने का एक टाइप है.
यह एक्सटेंडर टाइप, extensions-interface
के वर्शन 1.2.0 में जोड़ा गया था. डिवाइस बनाने वाली कंपनी के हिसाब से, ऐप्लिकेशन लेयर में एक्सटेंशन लागू किए जा सकते हैं. यह इन बातों पर निर्भर करता है:
कस्टम स्ट्रीम कॉन्फ़िगरेशन: RAW स्ट्रीम जैसी कस्टम स्ट्रीम कॉन्फ़िगर करें या अलग-अलग कैमरा आईडी के लिए एक से ज़्यादा स्ट्रीम कॉन्फ़िगर करें.
Camera2 अनुरोध भेजने की सुविधा: यह एक जटिल इंटरैक्शन लॉजिक है जो पिछले अनुरोधों के नतीजों के आधार पर पैरामीटर के साथ कैप्चर करने के अनुरोध भेज सकता है.
बेहतर एक्सटेंडर, एक रैपर या इंटरमीडियरी लेयर उपलब्ध कराता है, ताकि आप स्ट्रीम कॉन्फ़िगरेशन को पसंद के मुताबिक बना सकें और मांग पर कैप्चर करने के अनुरोध भेज सकें.
लागू की जाने वाली फ़ाइलें
बेहतर एक्सटेंडर लागू करने के लिए, ExtensionVersionImpl
में isAdvancedExtenderImplemented()
का तरीका, true
दिखाना चाहिए. हर तरह के एक्सटेंशन के लिए, OEM को उससे जुड़ी एक्सटेंडर क्लास लागू करनी होंगी. Advanced Extender को लागू करने की फ़ाइलें, advanced पैकेज में होती हैं.
लागू करने के लिए एक्सटेंडर क्लास | |
---|---|
रात | advanced/NightAdvancedExtenderImpl.java
|
एचडीआर | advanced/HdrAdvancedExtenderImpl.java
|
अपने-आप | advanced/AutoAdvancedExtenderImpl.java
|
बोकेह | advanced/BokehAdvancedExtenderImpl.java
|
चेहरे की फ़ोटो क्वालिटी में सुधार | advanced/BeautyAdvancedExtenderImpl.java
|
हमने इस उदाहरण में, AdvancedExtenderImpl
को प्लेसहोल्डर के तौर पर इस्तेमाल किया है.
इसे उस एक्सटेंशन के लिए एक्सटेंडर फ़ाइल के नाम से बदलें जिसे लागू किया जा रहा है.
चलिए देखते हैं कि Camera2/X, तीन ऐप्लिकेशन फ़्लो को पूरा करने के लिए, extensions-interface
को कैसे इस्तेमाल करता है.
ऐप्लिकेशन फ़्लो 1: एक्सटेंशन की उपलब्धता देखना
आठवीं इमेज. ऐडवांस एक्सटेंडर पर ऐप्लिकेशन का पहला फ़्लो
सबसे पहले, ऐप्लिकेशन यह जांच करता है कि दिया गया एक्सटेंशन काम करता है या नहीं.
ऐप्लिकेशन का दूसरा फ़्लो: क्वेरी की जानकारी
नौवीं इमेज. बेहतर एक्सटेंडर पर ऐप्लिकेशन फ़्लो 2
AdvancedExtenderImpl.init()
को कॉल करने के बाद, ऐप्लिकेशन AdvancedExtenderImpl
पर दी गई जानकारी के आधार पर क्वेरी कर सकता है:
स्टिल कैप्चर में लगने वाला अनुमानित समय:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
, ऐप्लिकेशन के लिए कैप्चर में लगने वाले समय की सीमा दिखाता है. इससे यह पता चलता है कि मौजूदा स्थिति के लिए, एक्सटेंशन चालू करना सही है या नहीं.झलक देखने और फ़ोटो खींचने के लिए इस्तेमाल किए जा सकने वाले रिज़ॉल्यूशन:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
, इमेज फ़ॉर्मैट का मैप दिखाता है. यह मैप, झलक दिखाने वाले प्लैटफ़ॉर्म के फ़ॉर्मैट और साइज़ के लिए इस्तेमाल किए जा सकने वाले साइज़ की सूची में दिखता है. OEM, कम से कमPRIVATE
फ़ॉर्मैट के साथ काम करने चाहिए.AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
, स्टिल कैप्चर की सुविधा के लिए इस्तेमाल किए जा सकने वाले फ़ॉर्मैट और साइज़ दिखाता है. OEM के डिवाइसों पर,JPEG
औरYUV_420_888
, दोनों फ़ॉर्मैट में आउटपुट मिलना चाहिए.AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
, इमेज के विश्लेषण के लिए, अतिरिक्तYUV_420_888
स्ट्रीम के लिए काम करने वाले साइज़ दिखाता है. अगर इमेज विश्लेषण के लिए YUV प्लैटफ़ॉर्म काम नहीं करता है, तोgetSupportedYuvAnalysisResolutions()
कोnull
या खाली सूची दिखानी चाहिए.
कैप्चर रिक्वेस्ट के लिए उपलब्ध कुंजियां/नतीजे (
extensions-interface
1.3.0 में जोड़ा गया): Camera2/X, आपके लागू किए गए कैप्चर रिक्वेस्ट के लिए काम करने वाली कुंजियों और नतीजों की कुंजियों को वापस पाने के लिए, इन तरीकों का इस्तेमाल करता है:AdvancedExtenderImpl.getAvailableCaptureRequestKeys
AdvancedExtenderImpl.getAvailableCaptureResultKeys
ज़्यादा जानकारी के लिए, सहायता कैप्चर करने के अनुरोध की कुंजियां और नतीजे देखें.
ऐप्लिकेशन फ़्लो 3: एक्सटेंशन चालू होने पर झलक देखना/स्टिल कैप्चर करना
10वीं इमेज. बेहतर एक्सटेंडर पर ऐप्लिकेशन फ़्लो 3
ऊपर दिए गए डायग्राम में, बेहतर एक्सटेंडर टाइप के लिए झलक शुरू करने और स्टिल कैप्चर करने का मुख्य फ़्लो दिखाया गया है. आइए, सिलसिलेवार तरीके से इसकी प्रोसेस जानते हैं.
SessionProcessorImpl
इंस्टेंसबेहतर एक्सटेंडर को लागू करने की मुख्य सुविधा
SessionProcessorImpl
में है. यह उपयोगकर्ता के हिसाब से सेशन कॉन्फ़िगरेशन उपलब्ध कराता है. साथ ही, झलक देखने और फ़ोटो कैप्चर करने के अनुरोध शुरू करने के लिए, कैप्चर करने के अनुरोध भेजता है.SessionProcessorImpl
इंस्टेंस को लौटाने के लिएAdvancedExtenderImpl.createSessionProcessor()
को शुरू किया गया है.initSession
SessionProcessorImpl.initSession()
, एक्सटेंशन के लिए सेशन शुरू करता है. यहां संसाधनों को बांटा जाता है औरCameraCaptureSession
को तैयार करने के लिए सेशन कॉन्फ़िगरेशन दिखाया जाता है.इनपुट पैरामीटर के लिए, Camera2/X, झलक, स्टिल कैप्चर, और YUV इमेज के विश्लेषण के लिए आउटपुट की सतह के कॉन्फ़िगरेशन तय करता है. हालांकि, YUV इमेज का विश्लेषण करना ज़रूरी नहीं है. इस आउटपुट सर्फ़ेस कॉन्फ़िगरेशन (
OutputSurfaceImpl
) में,AdvancedExtenderImpl
में बताए गए तरीकों से हासिल किए गए, सर्फ़ेस, साइज़, और इमेज फ़ॉर्मैट शामिल होते हैं:getSupportedPreviewOutputResolutions()
getSupportedCaptureOutputResolutions()
getSupportedYuvAnalysisResolutions()
आपको एक
Camera2SessionConfigImpl
इंस्टेंस दिखाना होगा. इसमेंCamera2OutputConfigImpl
इंस्टेंस की सूची औरCameraCaptureSession
को कॉन्फ़िगर करने के लिए इस्तेमाल किए गए सेशन पैरामीटर शामिल होंगे. Camera2/X की मदद से, आउटपुट के लिए इस्तेमाल किए जाने वाले प्लैटफ़ॉर्म पर सही कैमरा इमेज दिखाने की ज़िम्मेदारी आपकी है. आउटपुट चालू करने के कुछ विकल्प यहां दिए गए हैं:- कैमरा एचएएल में प्रोसेसिंग:
SurfaceOutputConfigImpl
को लागू करके, आउटपुट प्लैटफ़ॉर्म को सीधेCameraCaptureSession
में जोड़ा जा सकता है. इससे, आउटपुट वाली सतह को कैमरा पाइपलाइन से कॉन्फ़िगर किया जाता है और कैमरा एचएएल को इमेज प्रोसेस करने की अनुमति मिलती है. इंटरमीडिएट
ImageReader
प्लैटफ़ॉर्म (RAW, YUV वगैरह) को प्रोसेस करना:ImageReaderOutputConfigImpl
इंस्टेंस की मदद से, इंटरमीडिएटImageReader
प्लैटफ़ॉर्म कोCameraCaptureSession
में जोड़ें.आपको इंटरमीडिएट इमेज को प्रोसेस करना होगा और आउटपुट प्लैटफ़ॉर्म पर नतीजे वाली इमेज को लिखना होगा.
- Camera2 के साथ, स्क्रीन शेयर करने की सुविधा का इस्तेमाल करना: किसी दूसरे स्क्रीन के साथ स्क्रीन शेयर करने के लिए, किसी
Camera2OutputConfigImpl
इंस्टेंस को दूसरेCamera2OutputConfigImpl
इंस्टेंस केgetSurfaceSharingOutputConfigs()
तरीके में जोड़ें. प्लैटफ़ॉर्म का फ़ॉर्मैट और साइज़ एक जैसा होना चाहिए.
SurfaceOutputConfigImpl
औरImageReaderOutputConfigImpl
के साथ-साथ सभीCamera2OutputConfigImpl
में एक यूनीक आईडी (getId()
) होना चाहिए. इसका इस्तेमाल, टारगेट किए गए प्लैटफ़ॉर्म की जानकारी देने औरImageReaderOutputConfigImpl
से इमेज को वापस पाने के लिए किया जाता है.onCaptureSessionStart
औरRequestProcessorImpl
जब
CameraCaptureSession
शुरू होता है और Camera फ़्रेमवर्कonConfigured()
को शुरू करता है, तो Camera2/X, Camera2 अनुरोध रैपरRequestProcessImpl
के साथSessionProcessorImpl.onCaptureSessionStart()
को शुरू करता है. Camera2/X मेंRequestProcessImpl
लागू होता है. इससे, इमेज कैप्चर करने के अनुरोधों को पूरा किया जा सकता है. साथ ही,ImageReaderOutputConfigImpl
का इस्तेमाल करने पर, इमेज वापस लाई जा सकती हैं.अनुरोधों को लागू करने के मामले में,
RequestProcessImpl
एपीआई, Camera2CameraCaptureSession
एपीआई से मिलते-जुलते हैं. इनमें ये अंतर हैं:- टारगेट सरफ़ेस को
Camera2OutputConfigImpl
इंस्टेंस के आईडी से तय किया जाता है. ImageReader
की इमेज वापस लाने की सुविधा.
इमेज पाने के लिए,
ImageProcessorImpl
इंस्टेंस को रजिस्टर करने के लिए, किसी तय किए गएCamera2OutputConfigImpl
आईडी के साथRequestProcessorImpl.setImageProcessor()
को कॉल किया जा सकता है.Camera2/X के कॉल करने के बाद,
RequestProcessImpl
इंस्टेंस अमान्य हो जाता हैSessionProcessorImpl.onCaptureSessionEnd()
.- टारगेट सरफ़ेस को
झलक देखना और फ़ोटो खींचना
बेहतर एक्सटेंडर लागू करने के लिए,
RequestProcessorImpl
इंटरफ़ेस की मदद से कैप्चर करने के अनुरोध भेजे जा सकते हैं. Camera2/X, आपकोSessionProcessorImpl#startRepeating
औरSessionProcessorImpl#startCapture
को कॉल करके, झलक देखने या इमेज कैप्चर करने के क्रम को बार-बार देखने की सूचना देता है. झलक और फ़ोटो लेने के इन अनुरोधों को पूरा करने के लिए, आपको कैप्चर करने के अनुरोध भेजने चाहिए.Camera2/X,
SessionProcessorImpl#setParameters
के ज़रिए कैप्चर करने के अनुरोध के पैरामीटर भी सेट करता है. आपको बार-बार किए जाने वाले अनुरोधों और एक बार किए जाने वाले अनुरोधों, दोनों पर ये अनुरोध पैरामीटर सेट करने होंगे. हालांकि, ऐसा तब ही किया जा सकता है, जब पैरामीटर काम करते हों.आपको कम से कम
CaptureRequest.JPEG_ORIENTATION
औरCaptureRequest.JPEG_QUALITY
के साथ काम करना होगा.extensions-interface
1.3.0 में अनुरोध और नतीजे की कुंजियों का इस्तेमाल किया जा सकता है. ये कुंजियां इन तरीकों से एक्सपोज़ की जाती हैं:AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
जब डेवलपर
getAvailableCaptureRequestKeys
सूची में कुंजियां सेट करते हैं, तो आपको पैरामीटर चालू करने होंगे. साथ ही, यह पक्का करना होगा कि कैप्चर किए गए नतीजे मेंgetAvailableCaptureResultKeys
सूची में मौजूद कुंजियां शामिल हों.startTrigger
SessionProcessorImpl.startTrigger()
को ट्रिगर शुरू करने के लिए,CaptureRequest.CONTROL_AF_TRIGGER
औरCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
जैसे ट्रिगर का इस्तेमाल किया जाता है.AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
में जिन कैप्चर अनुरोध कुंजियों का विज्ञापन नहीं किया गया था उन्हें अनदेखा किया जा सकता है.startTrigger()
,extensions-interface
1.3.0 से काम करता है. इससे ऐप्लिकेशन, एक्सटेंशन के साथ टैप-टू-फ़ोकस और फ़्लैश की सुविधा लागू कर सकते हैं.खाली करने के लिए जगह
कैप्चर सेशन को पूरा करते समय,
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_STRENGTH
कैप्चर रिक्वेस्ट पैरामीटर का इस्तेमाल कर सकते हैं. साथ ही, चालू किए गए एक्सटेंशन टाइप की जानकारी देने के लिए EXTENSION_CURRENT_TYPE
कैप्चर के नतीजे का इस्तेमाल कर सकते हैं.
अनुरोध कैप्चर करना
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
जैसे एक्सटेंशन टाइप के बीच डाइनैमिक तौर पर स्विच करते हैं. यह स्विच, सीन की स्थितियों के हिसाब से होता है. इसलिए, कैमरे के एक्सटेंशन ऐप्लिकेशन, EXTENSION_CURRENT_TYPE
का इस्तेमाल करके AUTO
एक्सटेंशन से चुने गए मौजूदा एक्सटेंशन के बारे में जानकारी दिखा सकते हैं.
रीयल-टाइम स्टिल कैप्चर में लगने वाले समय का अनुमान
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 और इसके बाद के वर्शन के लिए, कैमरा एक्सटेंशन क्लाइंट को लंबे समय तक चलने वाले स्टिल कैप्चर प्रोसेसिंग ऑपरेशन की प्रोग्रेस के लिए कॉलबैक मिल सकते हैं. ऐप्लिकेशन, उपयोगकर्ताओं को मौजूदा प्रोग्रेस दिखा सकते हैं, ताकि उपयोगकर्ताओं का अनुभव बेहतर हो.
ऐप्लिकेशन इस सुविधा को इंटिग्रेट करने के लिए, इस कोड का इस्तेमाल कर सकते हैं:
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
SurfaceView आउटपुट के साथ काम करना
Android 14 और उसके बाद के वर्शन के लिए, कैमरा एक्सटेंशन क्लाइंट, बार-बार किए जाने वाले अनुरोधों के लिए, झलक के आउटपुट के लिए SurfaceView
इंस्टेंस रजिस्टर करके, बेहतर परफ़ॉर्मेंस वाले झलक रेंडर पाथ का इस्तेमाल कर सकते हैं.
SurfaceView
आउटपुट के साथ काम करने के लिए, आपके वेंडर एक्सटेंशन को SurfaceView
इंस्टेंस पर झलक को स्ट्रीम करने और आउटपुट करने की सुविधा होनी चाहिए. इस बात की पुष्टि करने के लिए कि इस प्रोटोकॉल का इस्तेमाल किया जा सकता है या नहीं, SurfaceViewExtensionPreviewTest.java
सीटीएस मॉड्यूल चलाएं.
वेंडर के हिसाब से सेशन के टाइप
इस सुविधा की मदद से, वेंडर एक्सटेंशन लागू करके, वेंडर के हिसाब से सेशन टाइप चुना जा सकता है. यह सेशन टाइप, डिफ़ॉल्ट वैल्यू के बजाय इंटरनल कैमरा कैप्चर सेशन में सेट किया जाएगा.
यह सुविधा, फ़्रेमवर्क और वेंडर स्टैक में पूरी तरह से काम करती है. साथ ही, इसका क्लाइंट/सार्वजनिक एपीआई पर कोई असर नहीं पड़ता.
वेंडर के हिसाब से सेशन टाइप चुनने के लिए, अपनी एक्सटेंशन लाइब्रेरी के लिए ये लागू करें:
* बुनियादी एक्सटेंशन के लिए ExtenderStateListener.onSessionType()
* बेहतर एक्सटेंशन के लिए Camera2SessionConfigImpl.getSessionType()
एक्सटेंशन इंटरफ़ेस के वर्शन का इतिहास
यहां दी गई टेबल में, Camera Extension के इंटरफ़ेस के वर्शन का इतिहास दिखाया गया है. आपको हमेशा वेंडर लाइब्रेरी के नए वर्शन का इस्तेमाल करना चाहिए.
वर्शन | जोड़ी गई सुविधाएं |
---|---|
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
: Camera2 और CameraX एक्सटेंशन एपीआई के लिए कैमरा एक्सटेंशन OEM लाइब्रेरी, जोExtensions-Interface
को लागू करती है. यह एक पासथ्रू के तौर पर काम करता है, जोExtensions-Interface
से आने वाले कॉल को सेवा पर फ़ॉरवर्ड करता है. इस लाइब्रेरी में, सेवा के साथ इंटरैक्ट करने के लिए एआईडीएल फ़ाइलें और रैपर क्लास भी उपलब्ध हैं.बेहतर एक्सटेंडर की सुविधा डिफ़ॉल्ट रूप से चालू होती है. बुनियादी एक्सटेंडर को चालू करने के लिए,
ExtensionsVersionImpl#isAdvancedExtenderImplemented
कोfalse
पर बदलें.extensions_service
: एक्सटेंशन सेवा को लागू करने का सैंपल. अपना लागू करने का तरीका यहां जोड़ें. इस सेवा में लागू किया जाने वाला इंटरफ़ेस,Extensions-Interface
जैसा ही है. उदाहरण के लिए,IAdvancedExtenderImpl.Stub
को लागू करने पर, वही कार्रवाइयां होती हैं जोAdvancedExtenderImpl
को लागू करने पर होती हैं.Image
औरTotalCaptureResult
को पार्सल करने के लिए,ImageWrapper
औरTotalCaptureResultWrapper
की ज़रूरत होती है.
किसी डिवाइस पर वेंडर लाइब्रेरी सेट अप करना
OEM वेंडर लाइब्रेरी को किसी ऐप्लिकेशन में नहीं बनाया जाता है. यह डिवाइस से Camera2/X के रनटाइम में लोड होती है. CameraX में, <uses-library>
टैग यह बताता है कि androidx.camera.extensions.impl
लाइब्रेरी, CameraX की डिपेंडेंसी है. इस लाइब्रेरी के बारे में camera-extensions
लाइब्रेरी की AndroidManifest.xml
फ़ाइल में बताया गया है. इसे रनटाइम के दौरान लोड करना ज़रूरी है. Camera2 में, फ़्रेमवर्क एक एक्सटेंशन सेवा लोड करता है. इसमें यह भी बताया जाता है कि रनटाइम के दौरान <uses-library>
एक ही androidx.camera.extensions.impl
लाइब्रेरी लोड होती है.
इससे एक्सटेंशन का इस्तेमाल करने वाले तीसरे पक्ष के ऐप्लिकेशन, OEM वेंडर लाइब्रेरी को अपने-आप लोड कर पाते हैं. OEM लाइब्रेरी को ज़रूरी नहीं के तौर पर मार्क किया जाता है, ताकि ऐप्लिकेशन उन डिवाइसों पर भी चल सकें जिनमें लाइब्रेरी मौजूद नहीं है. जब कोई ऐप्लिकेशन कैमरे के एक्सटेंशन का इस्तेमाल करने की कोशिश करता है, तो Camera2/X इस व्यवहार को अपने-आप मैनेज करता है. हालांकि, ऐसा तब ही होता है, जब डिवाइस बनाने वाली कंपनी डिवाइस पर OEM लाइब्रेरी डालती है, ताकि ऐप्लिकेशन उसे ढूंढ सके.
किसी डिवाइस पर OEM लाइब्रेरी सेट अप करने के लिए, यह तरीका अपनाएं:
- अनुमति वाली फ़ाइल जोड़ें. यह
<uses-library>
टैग के लिए ज़रूरी है. इसके लिए, इस फ़ॉर्मैट का इस्तेमाल करें:/etc/permissions/ANY_FILENAME.xml
. उदाहरण के लिए,/etc/permissions/camera_extensions.xml
. इस डायरेक्ट्री में मौजूद फ़ाइलें,<uses-library>
में बताई गई लाइब्रेरी को डिवाइस पर मौजूद फ़ाइल के असल पाथ से मैप करती हैं. फ़ाइल में ज़रूरी जानकारी जोड़ने के लिए, नीचे दिए गए उदाहरण का इस्तेमाल करें.
name
कोandroidx.camera.extensions.impl
होना चाहिए, क्योंकि CameraX इसी लाइब्रेरी को खोजता है.file
, उस फ़ाइल का ऐब्सलूट पाथ है जिसमें एक्सटेंशन लागू करने का विकल्प मौजूद है. उदाहरण के लिए,/system/framework/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 या उसके बाद के वर्शन में, CameraX एक्सटेंशन वाले डिवाइसों में ro.camerax.extensions.enabled
प्रॉपर्टी को true
पर सेट होना ज़रूरी है. इससे यह क्वेरी की जा सकती है कि डिवाइस पर एक्सटेंशन काम करते हैं या नहीं.
इसके लिए, डिवाइस बनाने वाली कंपनी की फ़ाइल में यह लाइन जोड़ें:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
पुष्टि करें
डेवलपमेंट के दौरान OEM वेंडर लाइब्रेरी को लागू करने की जांच करने के लिए, androidx-main/camera/integration-tests/extensionstestapp/
पर दिए गए उदाहरण के तौर पर दिए गए ऐप्लिकेशन का इस्तेमाल करें. यह ऐप्लिकेशन, वेंडर के अलग-अलग एक्सटेंशन के ज़रिए काम करता है.
लागू करने की प्रोसेस पूरी करने के बाद, कैमरा एक्सटेंशन की पुष्टि करने वाले टूल का इस्तेमाल करके, ऑटोमेटेड और मैन्युअल टेस्ट चलाएं. इससे यह पुष्टि की जा सकेगी कि वेंडर लाइब्रेरी को सही तरीके से लागू किया गया है.
एक्सटेंडेड सीन मोड बनाम कैमरा एक्सटेंशन
बोकेह एक्सटेंशन के लिए, कैमरा एक्सटेंशन का इस्तेमाल करने के अलावा, एक्सटेंशन को एक्सटेंडेड सीन मोड का इस्तेमाल करके भी एक्सपोज़ किया जा सकता है. इसे CONTROL_EXTENDED_SCENE_MODE
बटन से चालू किया जा सकता है.
लागू करने के बारे में ज़्यादा जानकारी के लिए, कैमरे में बोकेह इफ़ेक्ट देखें.
camera2 ऐप्लिकेशन के लिए कैमरा एक्सटेंशन की तुलना में, एक्सटेंडेड सीन मोड पर कम पाबंदियां होती हैं. उदाहरण के लिए, एक्सटेंडेड सीन मोड को किसी सामान्य CameraCaptureSession
इंस्टेंस में चालू किया जा सकता है. यह इंस्टेंस, स्ट्रीम के अलग-अलग कॉम्बिनेशन के साथ काम करता है और अनुरोध पैरामीटर कैप्चर करता है. इसके उलट, कैमरा एक्सटेंशन सिर्फ़ स्ट्रीम टाइप के एक तय सेट के साथ काम करते हैं. साथ ही, कैप्चर करने के अनुरोध के पैरामीटर के साथ भी सीमित तौर पर काम करते हैं.
एक्सटेंडेड सीन मोड का एक नुकसान यह है कि इसे सिर्फ़ कैमरा एचएएल में लागू किया जा सकता है. इसका मतलब है कि ऐप्लिकेशन डेवलपर के लिए उपलब्ध सभी ऑर्थोगोनल कंट्रोल के साथ काम करने के लिए, इसकी पुष्टि की जानी चाहिए.
हमारा सुझाव है कि एक्सटेंडेड सीन मोड और Camera Extensions, दोनों का इस्तेमाल करके बोकेह मोड चालू करें. ऐसा इसलिए, क्योंकि ऐप्लिकेशन, बोकेह मोड चालू करने के लिए किसी खास एपीआई का इस्तेमाल कर सकते हैं. हमारा सुझाव है कि पहले एक्सटेंडेड सीन मोड का इस्तेमाल करें. ऐसा इसलिए, क्योंकि ऐप्लिकेशन के लिए, बोकेह एक्सटेंशन को चालू करने का यह सबसे बेहतर तरीका है. इसके बाद, एक्सटेंडेड सीन मोड के आधार पर कैमरे के एक्सटेंशन इंटरफ़ेस को लागू किया जा सकता है. अगर कैमरा एचएएल में बोकेह लागू करना मुश्किल है, तो हमारा सुझाव है कि आप Camera एक्सटेंशन इंटरफ़ेस का इस्तेमाल करके, बोकेह एक्सटेंशन लागू करें. ऐसा इसलिए, क्योंकि इमेज को प्रोसेस करने के लिए, ऐप्लिकेशन लेयर में चलने वाले पोस्ट प्रोसेसर की ज़रूरत होती है.
अक्सर पूछे जाने वाले सवाल
क्या एपीआई लेवल पर कोई पाबंदी है?
हां. यह Android API की सुविधाओं के उस सेट पर निर्भर करता है जो OEM के लिए,
वेंडर लाइब्रेरी को लागू करने के लिए ज़रूरी है. उदाहरण के लिए,
ExtenderStateListener.onPresetSession()
टैग का बेसलाइन सेट करने के लिए,
SessionConfiguration.setSessionParameters()
कॉल का इस्तेमाल करता है. यह कॉल सिर्फ़ एपीआई लेवल 28 और इसके बाद के वर्शन पर उपलब्ध है. इंटरफ़ेस के अलग-अलग तरीकों के बारे में जानने के लिए, एपीआई का रेफ़रंस दस्तावेज़ देखें.