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_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: मुख्य-मुख्य मोड में सेंसर के लिए, हार्डवेयर शटर/एक्सपोज़र सिंक नहीं होता.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: मुख्य-सेकंडरी मोड में मौजूद सेंसर के लिए, हार्डवेयर शटर/एक्सपोज़र सिंक.
अलग-अलग कैमरों के लिए काम करने वाले पैरामीटर की सूची की मदद से, अपने-आप जानकारी भरें
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
. अगर लॉजिकल डिवाइस, अलग-अलग अनुरोधों के साथ काम नहीं करता है, तो सूची खाली हो सकती है.अगर किसी अनुरोध को स्वीकार किया जाता है, तो उस व्यक्तिगत
physicalCameraSettings
अनुरोध को प्रोसेस और लागू करें जो कैप्चर के अनुरोधों के हिस्से के तौर पर मिल सकता है और उस व्यक्ति के अनुरोध के मुताबिक, उसेphysicalCameraMetadata
में जोड़ सकता है.कैमरा एचएएल डिवाइस के 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 स्ट्रीम के बजाय फ़िज़िकल सब-कैमरा स्ट्रीम कॉन्फ़िगर करने की ज़रूरत होती है.
स्ट्रीम के कॉम्बिनेशन की गारंटी
लॉजिकल कैमरे और उसके फ़िज़िकल कैमरे, दोनों को यह पक्का करना होगा कि उनके डिवाइस लेवल के लिए ज़रूरी स्ट्रीम कॉम्बिनेशन उपलब्ध हों.
लॉजिकल कैमरा डिवाइस को ठीक उसी तरह से काम करना चाहिए जैसे उसके हार्डवेयर लेवल और क्षमताओं के हिसाब से किया जाता है. हमारा सुझाव है कि इसके फ़ीचर सेट में, अलग-अलग फ़िज़िकल कैमरों के फ़ीचर सेट शामिल हों.
Android 9 वाले डिवाइसों पर, गारंटी वाली हर स्ट्रीम के कॉम्बिनेशन के लिए, लॉजिकल कैमरे में ये सुविधाएं होनी चाहिए:
एक लॉजिकल YUV_420_888 या रॉ स्ट्रीम को, एक ही साइज़ और फ़ॉर्मैट की दो फ़िज़िकल स्ट्रीम से बदलना. हर स्ट्रीम, अलग-अलग फ़िज़िकल कैमरे से ली गई हो. हालांकि, यह ज़रूरी है कि फ़िज़िकल कैमरे में यह साइज़ और फ़ॉर्मैट काम करता हो.
अगर लॉजिकल कैमरा, RAW फ़ॉर्मैट में वीडियो रिकॉर्ड करने की सुविधा का विज्ञापन नहीं करता है, लेकिन फ़िज़िकल कैमरे करते हैं, तो दो रॉ स्ट्रीम जोड़ें. हर फ़िज़िकल कैमरे से एक रॉ स्ट्रीम जोड़ें. आम तौर पर, ऐसा तब होता है, जब फ़िज़िकल कैमरों के सेंसर के साइज़ अलग-अलग होते हैं.
एक ही साइज़ और फ़ॉर्मैट वाली लॉजिकल स्ट्रीम की जगह, फ़िज़िकल स्ट्रीम का इस्तेमाल करना. जब फ़िज़िकल और लॉजिकल स्ट्रीम के लिए, फ़्रेम की कम से कम अवधि एक जैसी हो, तो इससे कैप्चर के फ़्रेम रेट में कमी नहीं आनी चाहिए.
परफ़ॉर्मेंस और पावर से जुड़ी ज़रूरी बातें
परफ़ॉर्मेंस:
- फ़िज़िकल स्ट्रीम को कॉन्फ़िगर करने और स्ट्रीम करने पर, संसाधनों की कमी की वजह से, एनालॉग कैमरे की फ़ोटो खींचने की दर धीमी हो सकती है.
- कैमरे की फ़िज़िकल सेटिंग लागू करने से, कैप्चर करने की दर धीमी हो सकती है. ऐसा तब होता है, जब कैमरे में इस्तेमाल किए जा रहे कैमरों को अलग-अलग फ़्रेम रेट पर सेट किया गया हो.
पावर:
- डिफ़ॉल्ट केस में, एचएएल का पावर ऑप्टिमाइज़ेशन काम करता रहेगा.
- फ़िज़िकल स्ट्रीम को कॉन्फ़िगर करने या उनका अनुरोध करने से, एचएएल की पावर ऑप्टिमाइज़ेशन में बदलाव हो सकता है. साथ ही, इससे पावर का ज़्यादा इस्तेमाल हो सकता है.
पसंद के मुताबिक बनाएं
डिवाइस पर लागू करने के तरीके को पसंद के मुताबिक बनाने के लिए, ये तरीके अपनाएं.
- लॉजिकल कैमरा डिवाइस का फ़्यूज़्ड आउटपुट, पूरी तरह से एचएएल के लागू होने पर निर्भर करता है. फ़िज़िकल कैमरों से फ़्यूज़ की गई लॉजिकल स्ट्रीम को कैसे जनरेट किया जाता है, यह ऐप्लिकेशन और Android कैमरा फ़्रेमवर्क के लिए साफ़ तौर पर तय होता है.
- अलग-अलग फ़िज़िकल अनुरोध और नतीजों को दिखाने की सुविधा को चालू किया जा सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है. ऐसे अनुरोधों में उपलब्ध पैरामीटर का सेट, पूरी तरह से एचएएल के लागू होने के तरीके पर निर्भर करता है.
- Android 10 के बाद, एचएएल उन कैमरों की संख्या कम कर सकता है जिन्हें ऐप्लिकेशन सीधे तौर पर खोल सकता है. इसके लिए,
getCameraIdList
में कुछ या सभी PHYSICAL_ID का विज्ञापन नहीं दिखाया जाता. इसके बाद,getPhysicalCameraCharacteristics
को कॉल करने पर, फ़िज़िकल कैमरे की विशेषताएं दिखनी चाहिए.
पुष्टि करें
लॉजिकल मल्टी-कैमरा डिवाइसों को किसी भी सामान्य कैमरे की तरह कैमरा सीटीएस पास करना होगा.
इस तरह के डिवाइस को टारगेट करने वाले टेस्ट केस, LogicalCameraDeviceTest
मॉड्यूल में देखे जा सकते हैं.
ये तीन ITS टेस्ट, इमेज को सही तरीके से फ़्यूज़ करने के लिए, मल्टी-कैमरा सिस्टम को टारगेट करते हैं:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
सीन 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
पर जाएं. - अलग-अलग सुविधाओं वाले फ़िज़िकल कैमरों वाले एक से ज़्यादा कैमरे वाले डिवाइसों के लिए, पक्का करें कि डिवाइस किसी कंट्रोल के लिए किसी खास वैल्यू या रेंज के साथ काम करने का विज्ञापन सिर्फ़ तब दिखाए, जब ज़ूम की पूरी रेंज उस वैल्यू या रेंज के साथ काम करती हो. उदाहरण के लिए, अगर लॉजिकल कैमरे में अल्ट्रा-वाइड, वाइड, और टेलीफ़ोटो कैमरा शामिल है, तो ये काम करें:
- अगर फ़िज़िकल कैमरों के चालू अरे के साइज़ अलग हैं, तो
कैमरा HAL को फ़िज़िकल कैमरों के चालू अरे से
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 की सुविधा नहीं मिलेगी.
- अगर फ़िज़िकल कैमरों के चालू अरे के साइज़ अलग हैं, तो
कैमरा HAL को फ़िज़िकल कैमरों के चालू अरे से
- Android 10 से, स्ट्रीम के ऐसे कॉम्बिनेशन के साथ काम करने के लिए, लॉजिकल मल्टी-कैमरे की ज़रूरत नहीं होती जिनमें फ़िज़िकल स्ट्रीम शामिल होती हैं.
अगर एचएएल, फ़िज़िकल स्ट्रीम के साथ कॉम्बिनेशन के साथ काम करता है, तो:
- (Android 11 या उसके बाद वाले वर्शन) स्टीरियो और मोशन ट्रैकिंग जैसे इस्तेमाल के उदाहरणों को बेहतर तरीके से हैंडल करने के लिए, फ़िज़िकल स्ट्रीम आउटपुट के व्यू फ़ील्ड को हार्डवेयर से जितना हो सके उतना बड़ा बनाएं. हालांकि, अगर फ़िज़िकल स्ट्रीम और लॉजिकल स्ट्रीम, एक ही फ़िज़िकल कैमरे से शुरू होती हैं, तो हार्डवेयर की सीमाओं की वजह से फ़िज़िकल स्ट्रीम का फ़ील्ड ऑफ़ व्यू, लॉजिकल स्ट्रीम के फ़ील्ड ऑफ़ व्यू जैसा हो सकता है.
- एक से ज़्यादा फ़िज़िकल स्ट्रीम की वजह से मेमोरी पर पड़ने वाले दबाव को कम करने के लिए, पक्का करें कि ऐप्लिकेशन, फ़्री बफ़र (ऐसे बफ़र जिन्हें उपभोक्ता ने रिलीज़ किया है, लेकिन प्रोड्यूसर ने अभी तक उनका डेटा हटाया नहीं है) को डिएलोकेट करने के लिए
discardFreeBuffers
का इस्तेमाल करें. ऐसा तब करें, जब किसी फ़िज़िकल स्ट्रीम के कुछ समय के लिए बंद रहने की संभावना हो. - अगर अलग-अलग फ़िज़िकल कैमरों से आने वाली फ़िज़िकल स्ट्रीम आम तौर पर एक ही अनुरोध से नहीं जुड़ी होती हैं, तो पक्का करें कि ऐप्लिकेशन
surface group
का इस्तेमाल करें. इससे, ऐप्लिकेशन के दो फ़ेसिंग प्लैटफ़ॉर्म के लिए, एक बफ़र कतार का इस्तेमाल किया जा सकता है. इससे, मेमोरी का इस्तेमाल कम होता है.