कैमरा एक्सटेंशन

डिवाइस बनाने वाली कंपनियां, बोकेह, नाइट मोड, और एचडीआर जैसे एक्सटेंशन दिखा सकती हैं के ज़रिए कैमरा एक्सटेंशन इंटरफ़ेस के ज़रिए तीसरे पक्ष के डेवलपर को को निकाल सकते हैं. डेवलपर इसका इस्तेमाल कर सकते हैं: Camera2 एक्सटेंशन एपीआई और CameraX एक्सटेंशन एपीआई OEM वेंडर लाइब्रेरी में लागू किए गए एक्सटेंशन को ऐक्सेस करें.

इस्तेमाल किए जा सकने वाले एक्सटेंशन की सूची देखने के लिए, जो Camera2 में एक जैसे होते हैं और CameraX को ऐक्सेस करें, CameraX एक्सटेंशन एपीआई. अगर आपको कोई एक्सटेंशन जोड़ना है, तो गड़बड़ी की शिकायत दर्ज करें, समस्या को ट्रैक करने वाला टूल.

इस पेज पर, OEM वेंडर लाइब्रेरी को लागू करने और उसे चालू करने का तरीका बताया गया है: डिवाइस.

भवन निर्माण

नीचे दिया गया डायग्राम, कैमरा एक्सटेंशन के आर्किटेक्चर के बारे में बताता है इंटरफ़ेस या extensions-interface: भवन निर्माण

पहला डायग्राम. कैमरा एक्सटेंशन के आर्किटेक्चर का डायग्राम

जैसा कि डायग्राम में दिखाया गया है, कैमरा एक्सटेंशन का इस्तेमाल करने के लिए, आपको OEM वेंडर लाइब्रेरी से मिले extensions-interface को लागू करें. आपका OEM की वेंडर लाइब्रेरी में दो एपीआई चालू होते हैं: CameraX एक्सटेंशन एपीआई और Camera2 एक्सटेंशन एपीआई, जिनका इस्तेमाल CameraX और Camera2 ऐप्लिकेशन ऐक्सेस करने के लिए किया जाता है वेंडर एक्सटेंशन.

OEM वेंडर लाइब्रेरी को लागू करें

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

आपको हर एक्सटेंशन के लिए लागू करने की ज़रूरत नहीं है. अगर आपको एक्सटेंशन लागू न करें, isExtensionAvailable() को false लौटाने के लिए सेट करें या संबंधित एक्सटेंडर क्लास हटाएं. Camera2 और CameraX एक्सटेंशन API, ऐप्लिकेशन को रिपोर्ट करता है कि एक्सटेंशन उपलब्ध नहीं है.

आइए जानते हैं कि Camera2 और CameraX एक्सटेंशन एपीआई, वेंडर लाइब्रेरी से भी ऐक्सेस किया जा सकता है. नीचे दिए गए डायग्राम में नाइट एक्सटेंशन का इस्तेमाल करके, एंड-टू-एंड फ़्लो का उदाहरण देखें:

मेनफ़्लो

दूसरा डायग्राम. नाइट एक्सटेंशन लागू करना

  1. वर्शन की पुष्टि करना:

    Camera2/X, ExtensionVersionImpl.checkApiVersion() को कॉल करता है, ताकि यह पक्का किया जा सके कि OEM की ओर से लागू किया गया extensions-interface का वर्शन, Camera2/X के साथ काम करता है इस्तेमाल किए जा सकते हैं.

  2. वेंडर लाइब्रेरी शुरू करना:

    InitializerImpl में init() तरीका है, जिससे वेंडर लाइब्रेरी शुरू होती है. एक्सटेंडर क्लास ऐक्सेस करने से पहले, Camera2/X शुरुआती प्रोसेस पूरी करता है.

  3. एक्सटेंडर क्लास इंस्टैंशिएट करें:

    एक्सटेंशन के लिए एक्सटेंडर क्लास इंस्टैंशिएट करता है. दो एक्सटेंडर हैं टाइप: बेसिक एक्सटेंडर और ऐडवांस एक्सटेंडर. आपको इनमें से किसी एक को लागू करना होगा सभी एक्सटेंशन के लिए एक्सटेंडर टाइप. ज़्यादा जानकारी के लिए, यह देखें बेसिक एक्सटेंडर बनाम बेहतर एक्सटेंडर.

    कैमरा 2/X वापस पाने के लिए, Extender क्लास से इंटरैक्ट करता है और इंटरैक्ट करता है जानकारी देखें और एक्सटेंशन को चालू करें. किसी दिए गए एक्सटेंशन के लिए, Camera2/X यह कर सकता है: एक्सटेंडर क्लास को कई बार इंस्टैंशिएट करना. इस वजह से, ये काम न करें कंस्ट्रक्टर या init() कॉल में भारी-भरकम इनिशलाइज़ेशन के साथ शुरू करना चाहिए. यह करें बहुत ज़्यादा लिफ़्ट तब तक नहीं बढ़ाया जा सकता, जब कैमरा सत्र शुरू होने वाला हो शुरू करते हैं, जैसे कि जब onInit() को बेसिक एक्सटेंडर में कॉल किया जाता है या initSession() को बेहतर एक्सटेंडर में कॉल किया जाता है.

    नाइट एक्सटेंशन के लिए, इन एक्सटेंडर क्लास को इंस्टैंशिएट किया जाता है: बेसिक एक्सटेंडर टाइप:

    • NightImageCaptureExtenderImpl.java
    • NightPreviewExtenderImpl.java

    और ऐडवांस एक्सटेंडर टाइप के लिए:

    • NightAdvancedExtenderImpl.java
  4. एक्सटेंशन की उपलब्धता की जांच करें:

    एक्सटेंशन को चालू करने से पहले, isExtensionAvailable() यह जांच करता है कि एक्सटेंशन, एक्सटेंडर के ज़रिए बताए गए कैमरा आईडी पर उपलब्ध होता है इंस्टेंस.

  5. कैमरे की जानकारी का इस्तेमाल करके, एक्सटेंडर शुरू करें:

    Camera2/X, Extender इंस्टेंस पर init() को कॉल करता है और उसे कैमरे के साथ शेयर करता है आईडी और CameraCharacteristics.

  6. क्वेरी की जानकारी:

    यह विकल्प, उस तरह की जानकारी हासिल करने के लिए Extender क्लास को शुरू करता है: साथ ही, इंतज़ार का अनुमानित समय अब भी कैप्चर किया जा सकता है. साथ ही, एक्सटेंडर को चालू करने के लिए तैयार करना होगा.

  7. एक्सटेंडर पर एक्सटेंशन चालू करें:

    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 को कॉल करें ExtensionVersionImpl.checkApiVersion() के साथ काम करता है extensions-interface वर्शन. इसके बाद, Camera2/X उस वर्शन का इस्तेमाल करता है जिसे OEM लाइब्रेरी यह तय करती है कि एक्सटेंशन को चालू किया जा सकता है या नहीं और क्या-क्या किया जा सकता है तो यह शुरू होना चाहिए.

मेजर वर्शन के साथ काम करता है

अगर एक्सटेंशन-इंटरफ़ेस के मुख्य वर्शन अलग-अलग हैं, तो Camera2/X और वेंडर लाइब्रेरी है, तो इसे काम नहीं करने वाला माना जाता है और एक्सटेंशन अक्षम है.

पुराने सिस्टम के साथ काम करने की सुविधा

जब तक मेजर वर्शन एक जैसा है, Camera2/X पक्का करता है कि पहले से बनी OEM वेंडर लाइब्रेरी के साथ पुराने सिस्टम के साथ काम करने की सुविधा extensions-interface वर्शन. उदाहरण के लिए, अगर Camera2/X काम करता हो extensions-interface 1.3.0, OEM वेंडर लाइब्रेरी जिन्होंने 1.0.0 को लागू किया, 1.1.0 और 1.2.0 अब भी काम करते हैं. इसका मतलब यह भी है कि लागू करने के बाद विक्रेता लाइब्रेरी के किसी ख़ास वर्शन का इस्तेमाल करते हैं, तो Camera2/X लाइब्रेरी को यह ऐप्लिकेशन, extension-interface के आने वाले वर्शन के साथ काम करता है.

फ़ॉरवर्ड करने की सुविधा

नए extensions-interface की वेंडर लाइब्रेरी के साथ फ़ॉरवर्ड काम करना ओईएम आप पर निर्भर करता है. अगर आपको एक्सटेंशन लागू करने के लिए कुछ सुविधाएं चाहिए, तो आप किसी खास वर्शन से शुरू होने वाले एक्सटेंशन चालू कर सकते हैं. इसमें ऐसी स्थिति में, extensions-interface के साथ काम करने वाला वर्शन दिखाया जा सकता है. ऐसा तब किया जा सकता है, जब Camera2/X लाइब्रेरी का वर्शन ज़रूरी शर्तों को पूरा करता है. अगर Camera2/X वर्शन समर्थित नहीं हैं, तो आप असंगत वर्शन जैसे 99.0.0 को एक्सटेंशन बंद कर देते हैं.

वेंडर लाइब्रेरी शुरू करना

ओईएम के लागू किए गए extensions-interface वर्शन की पुष्टि करने के बाद लाइब्रेरी है, तो Camera2/X शुरू करने की प्रोसेस शुरू करता है. कॉन्टेंट बनाने InitializerImpl.init() तरीका, OEM लाइब्रेरी को यह सिग्नल देता है कि कोई ऐप्लिकेशन आज़मा रहा है एक्सटेंशन का इस्तेमाल करने के लिए.

Camera2/X, OEM लाइब्रेरी को कोई और कॉल नहीं करता (वर्शन की जांच के अलावा) जब तक OEM वेंडर लाइब्रेरी OnExtensionsInitializedCallback.onSuccess() को कॉल नहीं करती शुरू करने की प्रोसेस पूरी होने की सूचना देने के लिए.

लागू करना ज़रूरी है InitializerImpl extensions-interface के 1.1.0 से लागू. Camera2/X, लाइब्रेरी को शुरू करने की प्रोसेस को स्किप कर देता है यह चरण अगर OEM वेंडर लाइब्रेरी में extensions-interface 1.0.0 को लागू किया जाता है.

बेसिक एक्सटेंडर बनाम बेहतर एक्सटेंडर

extensions-interface को लागू करने के दो तरीके हैं: बेसिक एक्सटेंडर और बेहतर एक्सटेंडर. यह ऐडवांस एक्सटेंडर इस तारीख से काम कर रहा है extensions-interface 1.2.0.

ऐसे एक्सटेंशन के लिए बेसिक एक्सटेंडर लागू करें जो कैमरा एचएएल में इमेज को प्रोसेस करते हों या YUV स्ट्रीम प्रोसेस करने वाले पोस्ट प्रोसेसर का इस्तेमाल करना चाहिए.

ऐसे एक्सटेंशन के लिए ऐडवांस एक्सटेंडर लागू करें जिन्हें Camera2 को पसंद के मुताबिक बनाने की ज़रूरत होती है स्ट्रीम कॉन्फ़िगरेशन स्ट्रीम करने के लिए कहा जाता है. साथ ही, ज़रूरत के हिसाब से कैप्चर अनुरोध भी भेजे जाते हैं.

तुलना के लिए यहां दी गई टेबल देखें:

बेसिक एक्सटेंडर ऐडवांस एक्सटेंडर
स्ट्रीम कॉन्फ़िगरेशन फ़िक्स्ड
पूर्वावलोकन: PRIVATE या YUV_420_888 (अगर प्रोसेसर मौजूद है)
अब भी कैप्चर करें: JPEG या YUV_420_888 (अगर प्रोसेसर मौजूद है)
OEM के हिसाब से कस्टमाइज़ किया जा सकता है.
कैप्चर करने का अनुरोध भेजा जा रहा है सिर्फ़ Camera2/X, कैप्चर करने के अनुरोध भेज सकता है. पैरामीटर को ये अनुरोध शामिल नहीं किए जाएंगे. इमेज कैप्चर करने के लिए प्रोसेसर दिए जाने पर, Camera2/X कैप्चर करने के कई अनुरोध भेज सकता है. साथ ही, सभी इमेज और कैप्चर प्रोसेसर को नतीजे देता है. आपको एक RequestProcessorImpl इंस्टेंस दिया गया है कैमरा2 कैप्चर करने का अनुरोध स्वीकार करें और नतीजे और इमेज पाएं.

Camera2/X, startRepeating और startCapture को चालू कर रहा है SessionProcessorImpl पर, OEM को टास्क को दोहराना शुरू करने का निर्देश दिया जाएगा झलक के लिए अनुरोध करें और क्रम से कैप्चर करना शुरू करें.

कैमरा पाइपलाइन में हुक
  • onPresetSession से सेशन के पैरामीटर मिलते हैं.
  • CameraCaptureSession के कॉन्फ़िगर होने के तुरंत बाद, onEnableSession एक अनुरोध भेजता है.
  • CameraCaptureSession बंद होने से पहले, onDisableSession एक अनुरोध भेजता है.
  • initSession, पसंद के मुताबिक बनाया गया Camera2 शुरू करता है और नतीजे के तौर पर दिखाता है कैप्चर सेशन बनाने के लिए सेशन कॉन्फ़िगरेशन.
  • CameraCaptureSession के कॉन्फ़िगर होने के तुरंत बाद, onCaptureSessionStart शुरू हो जाता है.
  • CameraCaptureSession के बंद होने से पहले onCaptureSessionEnd सक्रिय हो जाता है.
इनके लिए सही है कैमरा एचएएल या प्रोसेसर में लागू किए गए एक्सटेंशन YUV इमेज.
  • इसमें एक्सटेंशन के लिए, Camera2 इस्तेमाल करने की सुविधा का इस्तेमाल किया गया है.
  • RAW स्ट्रीम जैसे कस्टमाइज़ किए गए स्ट्रीम कॉन्फ़िगरेशन की ज़रूरत होती है.
  • इंटरैक्टिव कैप्चर सीक्वेंस की ज़रूरत है.
साथ काम करने वाले एपीआई का वर्शन Camera2 एक्सटेंशन: Android 13 या उसके बाद के वर्शन वाला
CameraX एक्सटेंशन: camera-extensions 1.1.0 या उसके बाद के वर्शन
Camera2 एक्सटेंशन: Android 12L या इसके बाद के वर्शन वाला
CameraX एक्सटेंशन: camera-extensions 1.2.0-alpha03 या उसके बाद का वर्शन

ऐप्लिकेशन फ़्लो

नीचे दी गई टेबल में तीन तरह के ऐप्लिकेशन फ़्लो और उनके संबंधित Camera एक्सटेंशन एपीआई कॉल. जब Camera2/X में ये सुविधाएं मिलती हैं इन एपीआई के लिए बना है, तो आपको इनका सही तरीके से इस्तेमाल करने के लिए, वेंडर लाइब्रेरी को सही तरीके से लागू करना होगा हैं, जिसके बारे में हम बाद के सेक्शन में विस्तार से बताएंगे.

Camera2 एक्सटेंशन CameraX एक्सटेंशन
क्वेरी एक्सटेंशन की उपलब्धता CameraExtensionCharacteristics .getSupportedExtensions ExtensionsManager. isExtensionAvailable
क्वेरी की जानकारी CameraExtensionCharacteristics. getExtensionSupportedSizes CameraExtensionCharacteristics. getEstimatedCaptureLatencyRangeMillis CameraExtensionCharacteristics. getAvailableCaptureRequestKeys CameraExtensionCharacteristics. getAvailableCaptureResultKeys ExtensionsManager. getEstimatedCaptureLatencyRange

CameraX, लाइब्रेरी में मौजूद बाकी जानकारी का इस्तेमाल करता है.

एक्सटेंशन चालू होने पर, झलक देखें और फ़ोटो या वीडियो को स्टिल-कैप्चर करें CameraDevice. createExtensionSession

cameraExtensionsSession. setRepeatingRequest

cameraExtensionsSession. capture

val cameraSelector = ExtensionsManager. getExtensionEnabledCameraSelector

bindToLifecycle(lifecycleOwner, cameraSelector, preview, ...)

बेसिक एक्सटेंडर

बेसिक एक्सटेंडर इंटरफ़ेस की मदद से, कैमरे में कई जगहों पर हुक बनाए जा सकते हैं पाइपलाइन. हर टाइप के एक्सटेंशन के लिए, OEM को ज़रूरत के हिसाब से एक्सटेंडर क्लास होती हैं .

नीचे दी गई टेबल में उन एक्सटेंडर क्लास की सूची दी गई है जिन्हें OEMS को हर एक इवेंट के लिए लागू करना होता है एक्सटेंशन:

लागू करने के लिए क्लास को बढ़ाना
नाइट NightPreviewExtenderImpl.java

NightImageCaptureExtenderImpl.java

एचडीआर HdrPreviewExtenderImpl.java

HdrImageCaptureExtenderImpl.java

अपने-आप AutoPreviewExtenderImpl.java

AutoImageCaptureExtenderImpl.java

बोकेह BokehPreviewExtenderImpl.java

BokehImageCaptureExtenderImpl.java

चेहरे की फ़ोटो क्वालिटी में सुधार BeautyPreviewExtenderImpl.java

BeautyImageCaptureExtenderImpl.java

हम प्लेसहोल्डर के तौर पर PreviewExtenderImpl और ImageCaptureExtenderImpl का इस्तेमाल करते हैं नीचे दिए गए उदाहरण में देखें. इन्हें वास्तविक नाम के नामों से बदलें जिन्हें आप लागू कर रहे हैं.

बेसिक एक्सटेंडर में ये सुविधाएं मिलती हैं:

  • CameraCaptureSession को कॉन्फ़िगर करते समय, सेशन पैरामीटर इंजेक्ट करें ( onPresetSession).
  • कैप्चर सेशन के शुरू और बंद होने की सूचना दें. साथ ही, एक साथ सिंगल भेजें लौटाए गए पैरामीटर (onEnableSession, onDisableSession).
  • अनुरोध के लिए कैप्चर पैरामीटर इंजेक्ट करें (PreviewExtenderImpl.getCaptureStage, ImageCaptureExtenderImpl.getCaptureStages).
  • झलक के लिए प्रोसेसर जोड़ें और फिर भी ऐसे प्रोसेसर को कैप्चर करें जिन्हें प्रोसेस किया जा सकता है YUV_420_888 स्ट्रीम.

आइए देखते हैं कि Camera2/X, तीन चरणों को पूरा करने के लिए, extensions-interface को कैसे शुरू करता है ऐप्लिकेशन फ़्लो के बारे में ऊपर बताया गया है.

ऐप्लिकेशन फ़्लो 1: एक्सटेंशन की उपलब्धता देखना

BasicExtenderAppFlow1

तीसरी इमेज. बेसिक एक्सटेंडर पर ऐप्लिकेशन फ़्लो 1

इस फ़्लो में, Camera2/X सीधे तौर परisExtensionAvailable() बिना कॉल किए PreviewExtenderImpl और ImageCaptureExtenderImpl, दोनों init(). एक्सटेंशन चालू करने के लिए, दोनों एक्सटेंडर क्लास को true रिटर्न करना होगा.

आम तौर पर, यह पहला कदम होता है. इसके बाद, ऐप्लिकेशन यह जांच कर सकते हैं कि एक्सटेंशन की मदद से, टाइप, एक्सटेंशन को चालू करने से पहले दिए गए कैमरा आईडी के लिए काम करता हो. इसकी वजह यह है कि कुछ एक्सटेंशन सिर्फ़ कुछ कैमरा आईडी पर ही काम करते हैं.

ऐप्लिकेशन का फ़्लो 2: क्वेरी की जानकारी

BasicExtenderAppFlow2

चौथी इमेज. बेसिक एक्सटेंडर पर ऐप्लिकेशन फ़्लो 2

एक्सटेंशन उपलब्ध है या नहीं, यह तय करने के बाद ऐप्लिकेशन को क्वेरी करनी चाहिए कृपया एक्सटेंशन को सक्षम करने से पहले निम्न जानकारी को पढ़ें.

  • अब भी इंतज़ार का समय कैप्चर करें: ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange इसकी रेंज दिखाता है ऐप्लिकेशन के लिए कैप्चर में लगने वाले समय की जानकारी का आकलन करने के लिए किया जा सकता है. मौजूदा स्थिति के लिए एक्सटेंशन चालू करें.

  • झलक और कैप्चर सरफ़ेस के लिए इस्तेमाल किए जा सकने वाले साइज़: ImageCaptureExtenderImpl.getSupportedResolutions और PreviewExtenderImpl.getSupportedResolutions इमेज के फ़ॉर्मैट की सूची दिखाता है और साइज़, जो सरफ़ेस फ़ॉर्मैट और साइज़ के लिए काम करते हैं.

  • अनुरोध और नतीजे दिखाने वाली कुंजियां: Camera2/X, कैप्चर की जा सकने वाली फ़ाइलों को वापस पाने के लिए इन तरीकों को शुरू करता है लागू की गई कुंजियों और नतीजे कुंजियों का अनुरोध करें:

    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
    • ImageCaptureExtenderImpl.getAvailableCapturetResultKeys

Camera2/X, क्वेरी करने से पहले इन Extender क्लास पर हमेशा init() को कॉल करता है हमारा वीडियो देखें.

ऐप्लिकेशन फ़्लो 3: एक्सटेंशन चालू करके, झलक देखें/अब भी कैप्चर करें (HAL लागू करना)

BasicExtenderAppFlow3

पांचवी इमेज. बेसिक एक्सटेंडर पर ऐप्लिकेशन फ़्लो 3

ऊपर दिया गया डायग्राम, झलक को चालू करने के मुख्य फ़्लो को दिखाता है और किसी भी प्रोसेसर के बिना, एक्सटेंशन के साथ कैप्चर करें. इसका मतलब है कि कैमरा एचएएल एक्सटेंशन को प्रोसेस करता है.

इस फ़्लो में, Camera2/X पहले init() को कॉल करता है और फिर onInit को कॉल करता है. इससे आपको सूचना मिलती है तय किए गए एक्सटेंशन के साथ कैमरा सेशन शुरू होने वाला है. onInit() में हेवी-लिफ़्टिंग शुरू की जा सकती है.

CameraCaptureSession को कॉन्फ़िगर करते समय, Camera2/X शुरू हो जाता है सेशन के पैरामीटर पाने के लिए, onPresetSession. कैप्चर सेशन के बाद सफलतापूर्वक कॉन्फ़िगर किया गया, Camera2/X, onEnableSession को शुरू करता है और CaptureStageImpl जिसमें कैप्चर पैरामीटर मौजूद हों. कैमरा2/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 प्लैटफ़ॉर्म.

    लागू करने के लिए आपको PreviewImageProcessorImpl PreviewExtenderImpl.getProcessor में इंस्टेंस. इसलिए, प्रोसेसर YUV_420_888 इनपुट इमेज को प्रोसेस करने के लिए. इसे आउटपुट को झलक का PRIVATE फ़ॉर्मैट. इसके बजाय, Camera2/X YUV_420_888 प्लैटफ़ॉर्म का इस्तेमाल करता है वैल्यू को PRIVATE में से CameraCaptureSession को कॉन्फ़िगर करें.

    फ़्लो के लिए नीचे दिया गया उदाहरण देखें:

प्रीव्यूप्रोसेसर

छठी इमेज. PreviewImageProcessorImpl की मदद से फ़्लो की झलक देखें

PreviewImageProcessorImpl इंटरफ़ेस ProcessImpl तक विस्तार करता है और इसमें तीन अहम तरीके हैं:

  • onOutputSurface(Surface surface, int imageFormat), आउटपुट प्लैटफ़ॉर्म को सेट करता है प्रोसेसर के लिए. PreviewImageProcessorImpl के लिए, imageFormat एक पिक्सल है फ़ॉर्मैट, जैसे कि PixelFormat.RGBA_8888.

  • onResolutionUpdate(Size size) इनपुट इमेज का साइज़ सेट करता है.

  • onImageFormatUpdate(int imageFormat), इनपुट का इमेज फ़ॉर्मैट सेट करता है इमेज. फ़िलहाल, यह सिर्फ़ YUV_420_888 हो सकता है.

इमेज कैप्चर प्रोसेसर

अभी भी कैप्चर के लिए, आप किसी CaptureProcessorImpl इंस्टॉल करने के लिए, ImageCaptureExtenderImpl.getCaptureProcessor का इस्तेमाल करें. प्रोसेसर यह कैप्चर की गई YUV_420_888 इमेज की सूची को प्रोसेस करने और TotalCaptureResult इंस्टेंस और आउटपुट को YUV_420_888 सरफ़ेस पर लिखें.

आप अब भी अनुरोध कैप्चर करता है.

नीचे दिए गए डायग्राम में फ़्लो देखें:

कैप्चर प्रोसेसर

सातवीं इमेज. CaptureProcessorImpl के साथ फ़्लो कैप्चर करें

  1. Camera2/X, YUV_420_888 फ़ॉर्मैट सरफ़ेस का इस्तेमाल करता है, ताकि कॉन्फ़िगर करने के लिए अब भी कैप्चर किया जा सके उस सेशन के बाद शुरू करते हैं. Camera2/X इस नंबर पर कॉल करके, CaptureProcessorImpl को तैयार करता है:

    • CaptureProcessorImpl.onImageFormatUpdate() में YUV_420_888 की सदस्यता लें.
    • इनपुट इमेज के साइज़ के साथ CaptureProcessorImpl.onResolutionUpdate().
    • YUV_420_888 आउटपुट के साथ CaptureProcessorImpl.onOutputSurface() की जगह है.
  2. ImageCaptureExtenderImpl.getCaptureStages इनकी सूची दिखाता है CaptureStageImpl , जहां हर एलिमेंट कैप्चर पैरामीटर के साथ CaptureRequest इंस्टेंस को मैप करता है जिन्हें Camera2/X के ज़रिए भेजा जाता है. उदाहरण के लिए, अगर यह तीन CaptureStageImpl इंस्टेंस, Camera2/X, कैप्चर करने के तीन अनुरोध इसके साथ भेजता है संबंधित कैप्चर पैरामीटर captureBurst एपीआई.

  3. पाई गई इमेज और TotalCaptureResult इंस्टेंस एक साथ बंडल किए गए हैं और प्रोसेस के लिए CaptureProcessorImpl को भेजा जाएगा.

  4. CaptureProcessorImpl नतीजे की इमेज (YUV_420_888 फ़ॉर्मैट) को onOutputSurface() कॉल के ज़रिए दिया गया आउटपुट सरफ़ेस. Camera2/X इसे कन्वर्ट कर देता है इमेज को JPEG फ़ॉर्मैट में बदलें.

अनुरोध की कुंजियों और नतीजों को कैप्चर करने में मदद करने वाली सेवा

कैमरा प्रीव्यू और कैप्चर करने के अलावा, ऐप्लिकेशन ज़ूम सेट कर सकते हैं, Flash पैरामीटर, या टैप-टू-फ़ोकस ट्रिगर करना. ये पैरामीटर साथ काम करता है.

अनुमति देने के लिए, extensions-interface के वर्शन 1.3.0 में ये तरीके जोड़े गए हैं की मदद से उन पैरामीटर को दिखाया जा सकता है जो आपके ऐप्लिकेशन में काम करते हैं:

  • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys() नतीजे के तौर पर उन अनुरोध कुंजियों को कैप्चर करें जो आपके लागू करने के साथ काम करती हैं.
  • ImageCaptureExtenderImpl.getAvailableCaptureResultKeys() नतीजे के तौर पर कैप्चर के नतीजे में मौजूद नतीजे कुंजियों को कैप्चर करें.

अगर कैमरा एचएएल, एक्सटेंशन को प्रोसेस करता है, तो Camera2/X कैप्चर की गई कार्रवाई को फिर से हासिल कर लेता है नतीजे CameraCaptureSession.CaptureCallback में मिले. हालांकि, अगर प्रोसेसर लागू किया जाता है, तो Camera2/X कैप्चर के नतीजों को ProcessResultImpl , जिसे process() को भेजा जाता है में तरीका PreviewImageProcessorImpl और CaptureProcessorImpl. शिकायत करने की ज़िम्मेदारी आपकी है 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, दोनों लौटाए गए वर्शन की सूची में मौजूद हैं और उसमें सिर्फ़ ज़रूरी कुंजियां काम करें. उदाहरण के लिए, अगर आपने सिर्फ़ CaptureRequest#CONTROL_ZOOM_RATIO और CaptureRequest#SCALER_CROP_REGION को 1.3.0 लागू करने के बाद, उसे इसका मतलब है कि ऐप पर टैप करके फ़ोकस, फ़्लैश, और एक्सपोज़र सही होने पर सिर्फ़ ज़ूम किया जा सकता है मुआवज़े की अनुमति नहीं है.

ऐडवांस एक्सटेंडर

ऐडवांस्ड एक्सटेंडर, Camera2 API पर आधारित एक तरह का वेंडर है. यह एक्सटेंडर टाइप extensions-interface के 1.2.0 वर्शन में जोड़ा गया था. इसके आधार पर एक्सटेंशन, ऐप्लिकेशन लेयर में लागू किए जा सकते हैं. जो इन कारकों पर निर्भर करती है:

  • कस्टम स्ट्रीम कॉन्फ़िगरेशन: RAW स्ट्रीम जैसी कस्टम स्ट्रीम कॉन्फ़िगर करें या अलग-अलग फ़िज़िकल कैमरा आईडी के लिए कई स्ट्रीम हों.

  • Camera2 अनुरोध भेजने की सुविधा: मुश्किल इंटरैक्शन की सुविधा एक ऐसा लॉजिक जो इन नतीजों के आधार पर, पैरामीटर के साथ कैप्चर करने के अनुरोध भेज सकता है पिछले अनुरोध.

ऐडवांस एक्सटेंडर एक रैपर या इंटरमीडिएट लेयर देता है. इसकी मदद से स्ट्रीम कॉन्फ़िगरेशन को कस्टमाइज़ करने और मांग पर कैप्चर करने के अनुरोध भेज सकते हैं.

ऐसी फ़ाइलें जिन्हें लागू करना है

ऐडवांस एक्सटेंडर लागू करने की सुविधा पर स्विच करने के लिए, isAdvancedExtenderImplemented() तरीका यहां मिला है ExtensionVersionImpl true लौटाना होगा. हर तरह के एक्सटेंशन के लिए, OEM को संबंधित एक्सटेंडर क्लास. ऐडवांस एक्सटेंडर लागू करने वाली फ़ाइलें Advanced पैकेज में शामिल किया गया है.

लागू करने के लिए क्लास एक्सटेंडेट करें
नाइट advanced/NightAdvancedExtenderImpl.java
एचडीआर advanced/HdrAdvancedExtenderImpl.java
अपने-आप advanced/AutoAdvancedExtenderImpl.java
बोकेह advanced/BokehAdvancedExtenderImpl.java
चेहरे की फ़ोटो क्वालिटी में सुधार advanced/BeautyAdvancedExtenderImpl.java

हमने इस उदाहरण में, AdvancedExtenderImpl को प्लेसहोल्डर के तौर पर इस्तेमाल किया है. इसकी जगह पर उस एक्सटेंशन की फ़ाइल का नाम डालें जिसे लागू करना.

आइए देखते हैं कि Camera2/X, तीन चरणों को पूरा करने के लिए, extensions-interface को कैसे शुरू करता है ऐप्लिकेशन फ़्लो में मिलेगा.

ऐप्लिकेशन फ़्लो 1: एक्सटेंशन की उपलब्धता देखना

AdvancedAppFlow1

आठवीं इमेज. बेहतर एक्सटेंडर पर ऐप्लिकेशन फ़्लो 1

सबसे पहले, ऐप्लिकेशन यह जांच करता है कि दिया गया एक्सटेंशन काम करता है या नहीं.

ऐप्लिकेशन का फ़्लो 2: क्वेरी की जानकारी

AdvancedAppFlow2

नौवीं इमेज. बेहतर एक्सटेंडर पर ऐप्लिकेशन फ़्लो 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: एक्सटेंशन चालू होने पर, झलक देखें/अब भी कैप्चर करें

AdvancedAppFlow3

10वीं इमेज. बेहतर एक्सटेंडर पर ऐप्लिकेशन फ़्लो 3

ऊपर दिए गए डायग्राम में, झलक को शुरू करने और अब भी कैप्चर करने का मुख्य फ़्लो दिखाया गया है ऐडवांस एक्सटेंडर टाइप चुनें. आइए, हर चरण पर गौर करें.

  1. SessionProcessorImpl इंस्टेंस

    मुख्य ऐडवांस एक्सटेंडर लागू करने की सुविधा SessionProcessorImpl में है, जो कस्टमाइज़ की गई सत्र कॉन्फ़िगरेशन उपलब्ध कराने और झलक कैप्चर करने के अनुरोधों को कैप्चर करें और फिर भी अनुरोध को कैप्चर करें. AdvancedExtenderImpl.createSessionProcessor() को शुरू करने के लिए शुरू किया गया है SessionProcessorImpl इंस्टेंस.

  2. initSession

    SessionProcessorImpl.initSession(), एक्सटेंशन के लिए सेशन शुरू करता है. यहां पर संसाधन असाइन किए जाते हैं और सेशन को कॉन्फ़िगरेशन के तौर पर दिखाया जाता है CameraCaptureSession तैयार कर रही हूँ.

    इनपुट पैरामीटर के लिए, Camera2/X आउटपुट सरफ़ेस के कॉन्फ़िगरेशन की जानकारी देता है का इस्तेमाल किया जा सकता है. यह आउटपुट सरफ़ेस कॉन्फ़िगरेशन (OutputSurfaceImpl) में सरफ़ेस, साइज़, और इमेज शामिल है वे फ़ॉर्मैट जिन्हें AdvancedExtenderImpl में नीचे दिए गए तरीकों से फिर से पाया जाता है:

    • getSupportedPreviewOutputResolutions()
    • getSupportedCaptureOutputResolutions()
    • getSupportedYuvAnalysisResolutions()

    आपको Camera2SessionConfigImpl इंस्टेंस देना होगा, जिसमें Camera2OutputConfigImpl इंस्टेंस और इस्तेमाल किए गए सेशन पैरामीटर की सूची CameraCaptureSession को कॉन्फ़िगर करने के लिए. इसके लिए आप खुद ज़िम्मेदार हैं कैमरे से पास की गई इमेज के आउटपुट प्लैटफ़ॉर्म पर सही इमेज दिखाकर Camera2/X. आउटपुट चालू करने के लिए, यहां कुछ विकल्प दिए गए हैं:

    • कैमरा एचएएल में प्रोसेस किया जा रहा है: आउटपुट प्लैटफ़ॉर्म सीधे तौर पर जोड़े जा सकते हैं SurfaceOutputConfigImpl के साथ CameraCaptureSession के लिए लागू करना. इससे, दिया गया आउटपुट सरफ़ेस कैमरे पर कॉन्फ़िगर हो जाता है पाइपलाइन और कैमरा एचएएल को इमेज प्रोसेस करने की मंज़ूरी देता है.
    • इंटरमीडिएट ImageReader सरफ़ेस (RAW, YUV वगैरह) प्रोसेस किया जा रहा है: CameraCaptureSession के लिए बीच के ImageReader प्लैटफ़ॉर्म ImageReaderOutputConfigImpl इंस्टेंस.

      आपको बीच की इमेज प्रोसेस करनी होगी और नतीजों वाली इमेज को इस पर लिखना होगा की एक झलक दिखती है.

    • कैमरा2 प्लैटफ़ॉर्म शेयर करने की सुविधा इस्तेमाल करना: किसी दूसरे सरफ़ेस के साथ सरफ़ेस शेयर करने की सुविधा इस्तेमाल करें किसी भी Camera2OutputConfigImpl इंस्टेंस को किसी अन्य तरीके से getSurfaceSharingOutputConfigs() Camera2OutputConfigImpl इंस्टेंस. सतह का फ़ॉर्मैट और साइज़ एक जैसा.

    सभी Camera2OutputConfigImpl, जिनमें SurfaceOutputConfigImpl और ImageReaderOutputConfigImpl का यूनीक आईडी (getId()) होना ज़रूरी है, जो इसका इस्तेमाल, टारगेट प्लैटफ़ॉर्म की जानकारी देने और इमेज को वापस पाने के लिए किया जाता है ImageReaderOutputConfigImpl.

  3. onCaptureSessionStart और RequestProcessorImpl

    CameraCaptureSession के चालू होने और कैमरा फ़्रेमवर्क चालू होने पर onConfigured() और फिर Camera2/X शुरू करता है Camera2 अनुरोध वाला SessionProcessorImpl.onCaptureSessionStart() रैपर RequestProcessImpl. Camera2/X, RequestProcessImpl को लागू करता है, इसकी मदद से, कैप्चर के अनुरोध पूरे किए जा सकते हैं और अगर ImageReaderOutputConfigImpl का इस्तेमाल किया गया है, तो इमेज पाएं.

    RequestProcessImpl एपीआई, Camera2 से मिलते-जुलते हैं अनुरोधों को एक्ज़ीक्यूट करने के लिए CameraCaptureSession एपीआई. इनमें ये अंतर होते हैं:

    • टारगेट प्लैटफ़ॉर्म को Camera2OutputConfigImpl इंस्टेंस.
    • ImageReader की इमेज को वापस पाने की सुविधा.

    RequestProcessorImpl.setImageProcessor() को कॉल करने के लिए हैं. ImageProcessorImpl इंस्टेंस को रजिस्टर करने के लिए, Camera2OutputConfigImpl आईडी आपको इमेज नहीं मिलेंगी.

    Camera2/X कॉल के बाद, RequestProcessImpl इंस्टेंस अमान्य हो जाता है SessionProcessorImpl.onCaptureSessionEnd().

  4. झलक देखना शुरू करना और फ़ोटो खींचना

    ऐडवांस एक्सटेंडर लागू करने पर, कैप्चर करने के अनुरोध भेजे जा सकते हैं 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 सूची में कुंजियां मौजूद हैं.

  5. startTrigger

    SessionProcessorImpl.startTrigger() को ऐसे ट्रिगर को शुरू करने के लिए शुरू किया गया है CaptureRequest.CONTROL_AF_TRIGGER और CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER. किसी भी अनुरोध से जुड़ी उन कुंजियों को कैप्चर करें जिनका विज्ञापन नहीं दिखाया गया है AdvancedExtenderImpl.getAvailableCaptureRequestKeys().

    startTrigger(), extensions-interface के 1.3.0 से काम कर रहा है. यह ऐप्लिकेशन को एक्सटेंशन के साथ फ़ोकस करने और फ़्लैश लागू करने की सुविधा देता है.

  6. खाली करने के लिए जगह

    कैप्चर सेशन खत्म करते समय, बंद करने से पहले SessionProcessorImpl.onCaptureSessionEnd() का अनुरोध किया जाता है CameraCaptureSession. कैप्चर सत्र बंद होने के बाद, deInitSession() क्लीनअप करता है.

झलक, स्टिल कैप्चर, और इमेज का विश्लेषण करने की सुविधा

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

बेसिक एक्सटेंडर टाइप के लिए, भले ही एक्सटेंशन को झलक के लिए चालू किया गया हो, आपको ImageCaptureExtenderImpl और PreviewExtenderImpl, दोनों लागू करने होंगे दिए गए एक्सटेंशन के लिए. अक्सर, कोई ऐप्लिकेशन इमेज का कॉन्टेंट, जैसे कि क्यूआर कोड या टेक्स्ट ढूंढना. इस्तेमाल के इस उदाहरण में बेहतर तरीके से मदद करने के लिए के तौर पर सेट किया गया है, तो आपको प्रीव्यू, स्टिल कैप्चर, और किसी अन्य 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();

रीयल-टाइम में इंतज़ार के समय का अनुमान लगाने के लिए, लागू करें निम्न:

प्रोसेस की प्रोसेस के कॉलबैक को कैप्चर करें

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
    }
  }
…
}

कैप्चर प्रोसेसिंग प्रोग्रेस कॉलबैक की सुविधा के लिए, आपका एक्सटेंशन वेंडर लागू करने की प्रोसेस के लिए, मौजूदा प्रोग्रेस के साथ इन कॉलबैक को कॉल करना ज़रूरी है मान:

पोस्टव्यू अब भी कैप्चर किया जाता है

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();
…
}

पोस्टव्यू को अब भी कैप्चर करने की सुविधा का इस्तेमाल करने के लिए, वेंडर को लागू करने के लिए फ़ॉलो किया जा रहा है:

SurfaceView आउटपुट के साथ काम करता हो

Android 14 और उसके बाद वाले वर्शन के लिए, कैमरा एक्सटेंशन क्लाइंट पावर और परफ़ॉर्मेंस के लिए ऑप्टिमाइज़ की गई झलक रेंडर पाथ का इस्तेमाल कर सकता है. इसके लिए, SurfaceView का उदाहरण:

SurfaceView आउटपुट के साथ काम करने के लिए, आपका वेंडर एक्सटेंशन लागू करना ज़रूरी है यह SurfaceView इंस्टेंस में झलक स्ट्रीम और आउटपुट करने की सुविधा देता है. यहां की यात्रा पर हूं पुष्टि करें कि यह काम करता है, SurfaceViewExtensionPreviewTest.java चलाएं सीटीएस मॉड्यूल.

वेंडर के लिए खास तरह के सेशन

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

यह सुविधा पूरी तरह से फ़्रेमवर्क और वेंडर स्टैक में काम करती है. इससे क्लाइंट या सार्वजनिक तौर पर दिखने वाले एपीआई पर कोई असर नहीं पड़ता.

किसी वेंडर के हिसाब से सेशन टाइप चुनने के लिए, अपनी एक्सटेंशन लाइब्रेरी के लिए यह तरीका लागू करें: * बुनियादी एक्सटेंशन के लिए ExtenderStateListener.onSessionType() * बेहतर एक्सटेंशन के लिए Camera2SessionConfigImpl.getSessionType()

एक्सटेंशन इंटरफ़ेस वर्शन इतिहास

नीचे दी गई टेबल में, कैमरा एक्सटेंशन के इंटरफ़ेस का वर्शन इतिहास दिखाया गया है. आपने लोगों तक पहुंचाया मुफ़्त में वेंडर लाइब्रेरी को हमेशा सबसे नए वर्शन के साथ लागू करना चाहिए.

वर्शन जोड़ी गई सुविधाएं
1.0.0
  • वर्शन की पुष्टि
    • ExtensionVersionImpl
  • बेसिक एक्सटेंडर
    • PreviewExtenderImpl
    • ImageCaptureExtenderImpl
    • Processor
      • PreviewImageProcessorImpl
      • CaptureProcessorImpl
      • RequestUpdateProcessorImpl
1.1.0
  • लाइब्रेरी शुरू करना
    • InitializerImpl
  • इस्तेमाल किए जा सकने वाले रिज़ॉल्यूशन दिखाएं
    • PreviewExtenderImpl.getSupportedResolutions
    • ImageCaptureExtenderImpl.getSupportedResolutions
1.2.0
  • ऐडवांस एक्सटेंडर
    • AdvancedExtenderImpl
    • SessionProcessorImpl
  • कैप्चर होने में लगने वाला अनुमानित समय पाएं
    • ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
1.3.0
  • इस्तेमाल की जा सकने वाली कैप्चर रिक्वेस्ट/नतीजों की कुंजियां दिखाएं
    • ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys और getAvailableCaptureResultKeys
    • AdvancedExtenderImpl.getAvailableCaptureRequestKeys और getAvailableCaptureResultKeys
    • नया process() कॉल, जिसके लिए PreviewImageProcessorImpl और CaptureProcessorImpl में ProcessResultImpl मिलेंगे
    • सहायता के ट्रिगर टाइप का अनुरोध
      • AdvancedExtenderImpl.startTrigger
1.4.0
  • एक्सटेंशन के लिए खास मेटाडेटा
  • डायनामिक अभी भी प्रतीक्षा अवधि के अनुमानों को कैप्चर करता है
  • प्रोसेस की प्रोसेस के कॉलबैक को कैप्चर करें
  • पोस्टव्यू अब भी कैप्चर किया जाता है
  • SurfaceView आउटपुट के लिए सहायता
  • वेंडर के लिए खास तरह के सेशन

रेफ़रंस फ़ाइल को लागू करना

OEM वेंडर लाइब्रेरी को इन देशों में लागू करने की जानकारी दी गई है frameworks/ex.

  • advancedSample: ऐडवांस एक्सटेंडर को बुनियादी तौर पर लागू करना.

  • sample: बेसिक एक्सटेंडर को बुनियादी तौर पर लागू करना.

  • service_based_sample: लागू करने का तरीका, जो होस्ट करने का तरीका दिखाता है इस ब्राउज़र में कैमरा एक्सटेंशन Service. इस प्रोसेस में ये कॉम्पोनेंट शामिल होते हैं:

    • oem_library: Camera2 और CameraX एक्सटेंशन एपीआई के लिए कैमरा एक्सटेंशन OEM लाइब्रेरी जो Extensions-Interface को लागू करता है. यह ऐसे पासथ्रू के तौर पर काम करता है जो Extensions-Interface से कॉल को सेवा पर फ़ॉरवर्ड करता है. यह लाइब्रेरी यह आपको बातचीत करने के लिए AIDL फ़ाइलें और रैपर क्लास भी देता है सेवा.

      ऐडवांस एक्सटेंडर डिफ़ॉल्ट रूप से चालू रहता है. बेसिक एक्सटेंडर चालू करने के लिए, वापस लौटाने के लिए ExtensionsVersionImpl#isAdvancedExtenderImplemented को बदलें false.

    • extensions_service: एक्सटेंशन सेवा को लागू करने का सैंपल. लागू करने की प्रक्रिया जोड़ें यहां. इस सेवा में लागू किया जाने वाला इंटरफ़ेस मिलता-जुलता है Extensions-Interface तक. उदाहरण के लिए, IAdvancedExtenderImpl.Stub वही कार्रवाइयां करता है जो AdvancedExtenderImpl. ImageWrapper और TotalCaptureResultWrapper Image और TotalCaptureResult को पार्स करने लायक बनाने के लिए ज़रूरी है.

किसी डिवाइस पर वेंडर लाइब्रेरी सेट अप करना

OEM वेंडर लाइब्रेरी किसी ऐप्लिकेशन में पहले से मौजूद नहीं होती है; इसे डिवाइस से लोड किया जाता है कैमरा2/X के रनटाइम पर. CameraX में, <uses-library> टैग एलान करता है androidx.camera.extensions.impl लाइब्रेरी, जिसकी जानकारी AndroidManifest.xml camera-extensions लाइब्रेरी की फ़ाइल, CameraX पर निर्भर करती है, और यह होनी चाहिए और रनटाइम के दौरान लोड होता है. Camera2 में, फ़्रेमवर्क ऐसी एक्सटेंशन सेवा लोड करता है जो यह भी बताता है कि <uses-library> रनटाइम में androidx.camera.extensions.impl लाइब्रेरी का इस्तेमाल किया जा सकता है.

इससे एक्सटेंशन का इस्तेमाल करने वाले तीसरे पक्ष के ऐप्लिकेशन, OEM को अपने-आप लोड होने देते हैं वेंडर लाइब्रेरी. OEM लाइब्रेरी को 'ज़रूरी नहीं' के तौर पर मार्क किया गया है, ताकि ऐप्लिकेशन को डिवाइसों पर चलाया जा सके जिनके पास डिवाइस पर लाइब्रेरी नहीं है. जब कोई ऐप्लिकेशन कैमरे का इस्तेमाल करने की कोशिश करता है, तब Camera2/X इस कार्रवाई को अपने-आप मैनेज कर लेता है एक्सटेंशन, जब तक कि डिवाइस निर्माता OEM लाइब्रेरी को ताकि ऐप्लिकेशन उसे खोज सके.

किसी डिवाइस पर OEM लाइब्रेरी सेट अप करने के लिए, यह तरीका अपनाएं:

  1. अनुमति वाली फ़ाइल जोड़ें, जो <uses-library> टैग के लिए ज़रूरी है. इसके लिए, नीचे दिए गए फ़ॉर्मैट का इस्तेमाल करें: /etc/permissions/ANY_FILENAME.xml. इसके लिए उदाहरण, /etc/permissions/camera_extensions.xml. इस में मौजूद फ़ाइलें डायरेक्ट्री, <uses-library> में मौजूद लाइब्रेरी की मैपिंग असली फ़ाइल पाथ मिलता है.
  2. फ़ाइल में ज़रूरी जानकारी जोड़ने के लिए, नीचे दिए गए उदाहरण का इस्तेमाल करें.

    • 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 बटन दबाएं. लागू करने के बारे में ज़्यादा जानकारी के लिए, कैमरा बोकेह देखें.

एक्सटेंशन के कैमरा एक्सटेंशन की तुलना में, एक्सटेंडेड सीन मोड में कम पाबंदियां होती हैं कैमरा2 ऐप्लिकेशन. उदाहरण के लिए, एक्सटेंडेड सीन मोड को सामान्य CameraCaptureSession इंस्टेंस, जो फ़्लेक्सिबल स्ट्रीम के साथ काम करता है का इस्तेमाल करें और अनुरोध पैरामीटर को कैप्चर करें. इसके उलट, कैमरा एक्सटेंशन जिनमें तय की गई स्ट्रीम टाइप ही इस्तेमाल किए जा सकते हों और कॉन्टेंट कैप्चर करने के लिए सीमित तौर पर सहायता उपलब्ध हो अनुरोध पैरामीटर.

एक्सटेंडेड सीन मोड का एक नुकसान यह है कि इसे सिर्फ़ कैमरा एचएएल का मतलब है कि सभी पर काम करने के लिए इसकी पुष्टि की जानी ज़रूरी है ऐप्लिकेशन डेवलपर के लिए उपलब्ध ऑर्थोगोनल कंट्रोल.

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

अक्सर पूछे जाने वाले सवाल

क्या एपीआई लेवल पर कोई पाबंदी है?

हां. यह Android API की सुविधा के उस सेट पर निर्भर करता है जो OEM के लिए ज़रूरी है वेंडर लाइब्रेरी को लागू करने की सुविधा. उदाहरण के लिए, ExtenderStateListener.onPresetSession() SessionConfiguration.setSessionParameters() टैग का बेसलाइन सेट सेट करने के लिए कॉल करें. यह कॉल सिर्फ़ एपीआई लेवल पर उपलब्ध है 28 और उससे ज़्यादा. इंटरफ़ेस की खास विधियों के बारे में जानने के लिए, एपीआई के बारे में जानकारी देने वाले दस्तावेज़.