एक से ज़्यादा कैमरे इस्तेमाल करने की सुविधा

Android 9 में, एक से ज़्यादा कैमरे वाले डिवाइसों के लिए एपीआई की सुविधा जोड़ी गई है. इसके लिए, एक नए लॉजिकल कैमरा डिवाइस का इस्तेमाल किया जाता है. यह डिवाइस, एक ही दिशा में फ़ोकस करने वाले दो या उससे ज़्यादा फ़िज़िकल कैमरा डिवाइसों से बना होता है. लॉजिकल कैमरा डिवाइस को ऐप्लिकेशन के लिए, एक CameraDevice/CaptureSession के तौर पर दिखाया जाता है. इससे, ऐप्लिकेशन को एचएएल के साथ इंटिग्रेट किए गए कई कैमरे की सुविधाओं के साथ इंटरैक्ट करने की अनुमति मिलती है. ऐप्लिकेशन, कैमरे की फ़िज़िकल स्ट्रीम, मेटाडेटा, और कंट्रोल को ऐक्सेस और कंट्रोल कर सकते हैं. हालांकि, ऐसा करना ज़रूरी नहीं है.

एक से ज़्यादा कैमरे इस्तेमाल करने की सुविधा

पहली इमेज. एक से ज़्यादा कैमरे इस्तेमाल करने की सुविधा

इस डायग्राम में, अलग-अलग कैमरा आईडी को कलर कोड दिया गया है. यह ऐप्लिकेशन, एक ही समय पर हर फ़िज़िकल कैमरे से रॉ बफ़र स्ट्रीम कर सकता है. अलग-अलग कैमरों के लिए अलग-अलग कंट्रोल सेट किए जा सकते हैं और अलग-अलग मेटाडेटा भी पाए जा सकते हैं.

उदाहरण और सोर्स

एक से ज़्यादा कैमरे वाले डिवाइसों का विज्ञापन, एक से ज़्यादा कैमरे की सुविधा के बारे में सही जानकारी देकर किया जाना चाहिए.

कैमरा क्लाइंट, getPhysicalCameraIds() को कॉल करके, किसी खास लॉजिकल कैमरे में इस्तेमाल हुए फ़िज़िकल डिवाइसों के कैमरा आईडी के बारे में क्वेरी कर सकते हैं. नतीजे के तौर पर मिले आईडी का इस्तेमाल, setPhysicalCameraId() के ज़रिए अलग-अलग फ़िज़िकल डिवाइसों को कंट्रोल करने के लिए किया जाता है. ऐसे अलग-अलग अनुरोधों के नतीजों को पूरे नतीजे में खोजा जा सकता है. इसके लिए, getPhysicalCameraResults() को लागू करें.

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

फ़िज़िकल कैमरे की स्ट्रीम, सिर्फ़ फिर से प्रोसेस न करने के अनुरोधों के लिए काम करती हैं. साथ ही, ये सिर्फ़ मोनोक्रोम और बेयर सेंसर के लिए काम करती हैं.

लागू करना

सहायता से जुड़ी चेकलिस्ट

HAL साइड पर एक से ज़्यादा कैमरे वाले डिवाइसों को जोड़ने के लिए:

  • किसी भी लॉजिकल कैमरा डिवाइस के लिए, ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA की सुविधा जोड़ें. यह डिवाइस, दो या उससे ज़्यादा फ़िज़िकल कैमरों से जुड़ा हो और ऐप्लिकेशन के लिए भी उपलब्ध हो.
  • फ़िज़िकल कैमरा आईडी की सूची के साथ, स्टैटिक ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS मेटाडेटा फ़ील्ड को पॉप्युलेट करें.
  • डेप्थ से जुड़े स्टैटिक मेटाडेटा को पॉप्युलेट करें. इसकी ज़रूरत, फ़िज़िकल कैमरा स्ट्रीम के पिक्सल के बीच संबंध बनाने के लिए होती है: ANDROID_LENS_POSE_ROTATION, ANDROID_LENS_POSE_TRANSLATION, ANDROID_LENS_INTRINSIC_CALIBRATION, ANDROID_LENS_DISTORTION, ANDROID_LENS_POSE_REFERENCE.
  • स्टैटिक ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE मेटाडेटा फ़ील्ड को इस पर सेट करें:

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

  • अगर अलग-अलग अनुरोधों की सुविधा काम करती है, तो कैप्चर करने के अनुरोधों के हिस्से के तौर पर मिलने वाले अलग-अलग physicalCameraSettings को प्रोसेस और लागू करें. साथ ही, उनसे जुड़े अलग-अलग physicalCameraMetadata को उसी हिसाब से जोड़ें.

  • Camera HAL डिवाइस के 3.5 (Android 10 में लॉन्च किया गया) या इसके बाद के वर्शन के लिए, ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID रिज़ल्ट बटन को भरें. इसके लिए, डिवाइस में मौजूद फ़िज़िकल कैमरे के आईडी का इस्तेमाल करें. यह आईडी, डिवाइस में मौजूद लॉजिकल कैमरे के साथ काम करता है.

Android 9 वाले डिवाइसों के लिए, कैमरा डिवाइसों में एक लॉजिकल YUV/RAW स्ट्रीम को, एक ही साइज़ (RAW स्ट्रीम पर लागू नहीं होता) और दो फ़िज़िकल कैमरों के एक ही फ़ॉर्मैट वाली फ़िज़िकल स्ट्रीम से बदलने की सुविधा होनी चाहिए. यह Android 10 वाले डिवाइसों पर लागू नहीं होता.

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

स्ट्रीम का कॉन्फ़िगरेशन मैप

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

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

RAW फ़ॉर्मैट में कैप्चर करते समय, फ़िज़िकल सब-कैमरों के बीच स्विच करके, एचएएल की मदद से काम करने वाले ऑप्टिकल ज़ूम का फ़ायदा पाने के लिए, ऐप्लिकेशन को लॉजिकल RAW स्ट्रीम के बजाय, फ़िज़िकल सब-कैमरा स्ट्रीम कॉन्फ़िगर करनी होंगी.

स्ट्रीम के कॉम्बिनेशन की गारंटी

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

लॉजिकल कैमरा डिवाइस, अपने हार्डवेयर लेवल और क्षमताओं के आधार पर, फ़िज़िकल कैमरा डिवाइस की तरह ही काम करना चाहिए. हमारा सुझाव है कि इसके फ़ीचर सेट में, अलग-अलग फ़िज़िकल कैमरों के फ़ीचर सेट शामिल हों.

Android 9 वाले डिवाइसों पर, गारंटी वाली हर स्ट्रीम के कॉम्बिनेशन के लिए, लॉजिकल कैमरे में ये सुविधाएं होनी चाहिए:

  • एक लॉजिकल YUV_420_888 या रॉ स्ट्रीम को, एक ही साइज़ और फ़ॉर्मैट की दो फ़िज़िकल स्ट्रीम से बदलना. हर स्ट्रीम, अलग-अलग फ़िज़िकल कैमरे से ली गई हो. हालांकि, यह ज़रूरी है कि फ़िज़िकल कैमरे में यह साइज़ और फ़ॉर्मैट काम करता हो.

  • अगर लॉजिकल कैमरा, RAW फ़ॉर्मैट में रिकॉर्ड करने की सुविधा का विज्ञापन नहीं करता है, लेकिन फ़िज़िकल कैमरे ऐसा करते हैं, तो दो रॉ स्ट्रीम जोड़ें. हर फ़िज़िकल कैमरे से एक रॉ स्ट्रीम जोड़ें. आम तौर पर, ऐसा तब होता है, जब फ़िज़िकल कैमरों के सेंसर के साइज़ अलग-अलग होते हैं.

  • एक ही साइज़ और फ़ॉर्मैट की लॉजिकल स्ट्रीम के बजाय, फ़िज़िकल स्ट्रीम का इस्तेमाल करना. जब फ़िज़िकल और लॉजिकल स्ट्रीम के लिए, फ़्रेम की कम से कम अवधि एक जैसी हो, तो इससे कैप्चर के फ़्रेम रेट में कमी नहीं आनी चाहिए.

परफ़ॉर्मेंस और पावर से जुड़ी बातें

  • परफ़ॉर्मेंस:

    • फ़िज़िकल स्ट्रीम को कॉन्फ़िगर करने और स्ट्रीम करने पर, संसाधनों की कमी की वजह से, एनालॉग कैमरे की फ़ोटो खींचने की दर धीमी हो सकती है.
    • अगर कैमरे की फ़िज़िकल सेटिंग लागू की जाती हैं, तो कैप्चर रेट धीमा हो सकता है. ऐसा तब होता है, जब कैमरे को अलग-अलग फ़्रेम रेट पर सेट किया जाता है.
  • पावर:

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

पसंद के मुताबिक बनाएं

डिवाइस पर लागू करने के तरीके को पसंद के मुताबिक बनाने के लिए, ये तरीके अपनाएं.

  • लॉजिकल कैमरा डिवाइस का फ़्यूज़्ड आउटपुट, पूरी तरह से एचएएल के लागू होने पर निर्भर करता है. फ़िज़िकल कैमरों से फ़्यूज़ की गई लॉजिकल स्ट्रीम को कैसे जनरेट किया जाता है, यह ऐप्लिकेशन और Android कैमरा फ़्रेमवर्क के लिए साफ़ तौर पर दिखता है.
  • अलग-अलग फ़िज़िकल अनुरोध और नतीजों को दिखाने की सुविधा को चालू किया जा सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है. ऐसे अनुरोधों में उपलब्ध पैरामीटर का सेट, पूरी तरह से एचएएल के लागू होने के तरीके पर निर्भर करता है.
  • Android 10 के बाद, एचएएल उन कैमरों की संख्या को कम कर सकता है जिन्हें ऐप्लिकेशन सीधे तौर पर खोल सकता है. इसके लिए, getCameraIdList में कुछ या सभी PHYSICAL_ID का विज्ञापन नहीं दिखाया जाता. इसके बाद, getPhysicalCameraCharacteristics को कॉल करने पर, फ़िज़िकल कैमरे की विशेषताएं दिखनी चाहिए.

पुष्टि करें

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

ये तीन ITS टेस्ट, इमेज को सही तरीके से फ़्यूज़ करने के लिए, मल्टी-कैमरा सिस्टम को टारगेट करते हैं:

सीन 1 और सीन 4 के टेस्ट, ITS-in-a-box टेस्ट रिग की मदद से चलाए जाते हैं. test_multi_camera_match टेस्ट से पता चलता है कि दोनों कैमरे चालू होने पर, इमेज के बीच की चमक एक जैसी होती है. test_multi_camera_alignment जांच से पता चलता है कि कैमरे के बीच की दूरी, ओरिएंटेशन, और डिस्टॉर्शन पैरामीटर सही तरीके से लोड हुए हैं या नहीं. अगर मल्टी-कैमरा सिस्टम में वाइड फ़ील्ड ऑफ़ व्यू (90° से ज़्यादा) वाला कैमरा शामिल है, तो आईटीएस बॉक्स का rev2 वर्शन ज़रूरी है.

Sensor_fusion एक दूसरा टेस्ट रिग है, जो फ़ोन की बार-बार होने वाली, तय की गई गति को चालू करता है. साथ ही, यह पक्का करता है कि जियोस्कोप और इमेज सेंसर के टाइमस्टैंप मैच करते हों और मल्टी-कैमरा फ़्रेम सिंक हों.

सभी बॉक्स, AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) और MYWAY मैन्युफ़ैक्चरिंग (www.myway.tw, sales@myway.tw) के ज़रिए उपलब्ध हैं. इसके अलावा, rev1 ITS बॉक्स को West-Mark (www.west-mark.com, dgoodman@west-mark.com) से खरीदा जा सकता है.

सबसे सही तरीके

ऐप्लिकेशन के साथ काम करने वाले कई कैमरे वाले डिवाइस को लागू करते समय, कई कैमरे की सुविधाओं का पूरा फ़ायदा पाने के लिए, ये सबसे सही तरीके अपनाएं:

  • (Android 10 या इसके बाद के वर्शन) getCameraIdList से फ़िज़िकल सब-कैमरे छिपाएं. इससे, उन कैमरों की संख्या कम हो जाती है जिन्हें ऐप्लिकेशन सीधे तौर पर खोल सकते हैं. साथ ही, ऐप्लिकेशन को कैमरा चुनने का जटिल लॉजिक बनाने की ज़रूरत नहीं पड़ती.
  • (Android 11 या इसके बाद के वर्शन) ऑप्टिकल ज़ूम की सुविधा वाले कई कैमरे वाले डिवाइस के लिए, ANDROID_CONTROL_ZOOM_RATIO एपीआई लागू करें. साथ ही, सिर्फ़ आसपेक्ट रेशियो में काट-छांट करने के लिए, ANDROID_SCALER_CROP_REGION का इस्तेमाल करें. ANDROID_CONTROL_ZOOM_RATIO इससे डिवाइस को ज़ूम आउट करने और बेहतर सटीक जानकारी देने में मदद मिलती है. इस मामले में, ज़ूम करने के बाद फ़ील्ड ऑफ़ व्यू को सेंसर ऐक्टिव ऐरे के तौर पर इस्तेमाल करने के लिए, एचएएल को ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, और ANDROID_STATISTICS_FACE_LANDMARKS के निर्देशांक सिस्टम में बदलाव करना होगा. ANDROID_SCALER_CROP_REGION के साथ ANDROID_CONTROL_ZOOM_RATIO के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, camera3_crop_reprocess#cropping देखें.
  • अलग-अलग सुविधाओं वाले फ़िज़िकल कैमरे वाले कई कैमरे वाले डिवाइसों के लिए, पक्का करें कि डिवाइस किसी कंट्रोल के लिए किसी खास वैल्यू या रेंज के साथ काम करने का दावा सिर्फ़ तब करे, जब ज़ूम रेंज पूरी वैल्यू या रेंज के साथ काम करती हो. उदाहरण के लिए, अगर लॉजिकल कैमरे में अल्ट्रा-वाइड, वाइड, और टेलीफ़ोटो कैमरा शामिल है, तो ये काम करें:
    • अगर फ़िज़िकल कैमरों के ऐक्टिव ऐरे के साइज़ अलग-अलग हैं, तो कैमरा एचएएल को ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, और ANDROID_STATISTICS_FACE_LANDMARKS के लिए, फ़िज़िकल कैमरों के ऐक्टिव ऐरे से लॉजिकल कैमरे के ऐक्टिव ऐरे पर मैपिंग करनी होगी. ऐसा इसलिए, ताकि ऐप्लिकेशन के हिसाब से, कोऑर्डिनेट सिस्टम, लॉजिकल कैमरे के ऐक्टिव ऐरे का साइज़ हो.
    • अगर वाइड और टेलीफ़ोटो कैमरे में ऑटोफ़ोकस की सुविधा है, लेकिन अल्ट्रा-वाइड कैमरे में फ़िक्स फ़ोकस की सुविधा है, तो पक्का करें कि लॉजिकल कैमरे में ऑटोफ़ोकस की सुविधा का विज्ञापन दिखाया गया हो. एचएएल को अल्ट्रावाइड कैमरे के लिए ऑटोफ़ोकस स्टेट मशीन को सिम्युलेट करना चाहिए, ताकि जब ऐप्लिकेशन अल्ट्रावाइड लेंस पर ज़ूम आउट करे, तो ऐप्लिकेशन को यह पता चल सके कि कैमरे का फ़ोकस फ़िक्स है. साथ ही, काम करने वाले ऑटोफ़ोकस मोड के लिए ऑटोफ़ोकस स्टेट मशीन, उम्मीद के मुताबिक काम करें.
    • अगर वाइड और टेलीफ़ोटो कैमरे 4K @ 60 fps पर काम करते हैं और अल्ट्रा-वाइड कैमरा सिर्फ़ 4K @ 30 fps या 1080p @ 60 fps पर काम करता है, लेकिन 4K @ 60 fps पर काम नहीं करता, तो पक्का करें कि लॉजिकल कैमरा, काम करने वाले स्ट्रीम कॉन्फ़िगरेशन में 4K @ 60 fps का विज्ञापन न दिखाए. इससे कैमरे की लॉजिकल क्षमताओं की पुष्टि होती है. इससे यह पक्का होता है कि ऐप्लिकेशन को 1 से कम ANDROID_CONTROL_ZOOM_RATIO वैल्यू पर, 4K @ 60 fps की सुविधा नहीं मिलेगी.
  • Android 10 से, स्ट्रीम के ऐसे कॉम्बिनेशन के साथ काम करने के लिए, लॉजिकल मल्टी-कैमरे की ज़रूरत नहीं होती जिनमें फ़िज़िकल स्ट्रीम शामिल होती हैं. अगर एचएएल, फ़िज़िकल स्ट्रीम के साथ कॉम्बिनेशन में काम करता है, तो:
    • (Android 11 या इसके बाद के वर्शन) स्टीरियो और मोशन ट्रैकिंग से मिली गहराई जैसे इस्तेमाल के उदाहरणों को बेहतर तरीके से मैनेज करने के लिए, फ़िज़िकल स्ट्रीम आउटपुट के फ़ील्ड ऑफ़ व्यू को उतना बड़ा बनाएं जितना हार्डवेयर से हासिल किया जा सकता है. हालांकि, अगर फ़िज़िकल स्ट्रीम और लॉजिकल स्ट्रीम, एक ही फ़िज़िकल कैमरे से शुरू होती हैं, तो हार्डवेयर की सीमाओं की वजह से फ़िज़िकल स्ट्रीम का फ़ील्ड ऑफ़ व्यू, लॉजिकल स्ट्रीम के फ़ील्ड ऑफ़ व्यू जैसा हो सकता है.
    • एक से ज़्यादा फ़िज़िकल स्ट्रीम की वजह से मेमोरी पर पड़ने वाले दबाव को कम करने के लिए, पक्का करें कि ऐप्लिकेशन, फ़्री बफ़र (ऐसे बफ़र जिन्हें उपभोक्ता ने रिलीज़ किया है, लेकिन प्रोड्यूसर ने अभी तक उनका डेक्यू नहीं हटाया है) को डिएलोकेट करने के लिए discardFreeBuffers का इस्तेमाल करें. ऐसा तब करें, जब किसी फ़िज़िकल स्ट्रीम के कुछ समय के लिए बंद रहने की संभावना हो.
    • अगर अलग-अलग फ़िज़िकल कैमरों से आने वाली फ़िज़िकल स्ट्रीम आम तौर पर एक ही अनुरोध से नहीं जुड़ी होती हैं, तो पक्का करें कि ऐप्लिकेशन surface group का इस्तेमाल करें. इससे, ऐप्लिकेशन के दो फ़ेसिंग प्लैटफ़ॉर्म के लिए, एक बफ़र कतार का इस्तेमाल किया जा सकता है. इससे, मेमोरी खर्च कम होता है.