समवर्ती कैमरा स्ट्रीमिंग

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

  • getConcurrentCameraIds : वर्तमान में कनेक्टेड कैमरा डिवाइस पहचानकर्ताओं के संयोजन का सेट प्राप्त करता है जो कैमरा डिवाइस सत्रों को समवर्ती रूप से कॉन्फ़िगर करने का समर्थन करता है।
  • isConcurrentSessionConfigurationSupported : जांचता है कि कैमरा उपकरणों का प्रदान किया गया सेट और उनके संबंधित सत्र कॉन्फ़िगरेशन को समवर्ती रूप से कॉन्फ़िगर किया जा सकता है या नहीं।

अनिवार्य स्ट्रीम संयोजनों का एक सेट जिसे समवर्ती स्ट्रीमिंग के दौरान समर्थित किया जाना चाहिए, SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS प्रॉपर्टी में कैमरा डिवाइस की कैमरा विशेषताओं के माध्यम से शामिल किया गया है।

getConcurrentStreamingCameraIds() के माध्यम से विज्ञापित प्रत्येक कैमरा डिवाइस को समवर्ती स्ट्रीम के लिए निम्नलिखित गारंटीकृत कॉन्फ़िगरेशन का समर्थन करना चाहिए।

लक्ष्य 1 लक्ष्य 2
प्रकार अधिकतम आकार प्रकार अधिकतम आकार नमूना उपयोग के मामले
युवा एस1440पी इन-ऐप वीडियो या छवि प्रसंस्करण
निजी एस1440पी इन-ऐप दृश्यदर्शी विश्लेषण
जेपीईजी एस1440पी कोई दृश्यदर्शी अभी भी छवि कैप्चर नहीं करता
युवी/प्रिव एस720पी जेपीईजी एस1440पी मानक स्टिल इमेजिंग
युवी/प्रिव एस720पी युवी/प्रिव एस1440पी इन-ऐप वीडियो या पूर्वावलोकन के साथ प्रसंस्करण

Y8 का समर्थन करने वाले MONOCHROME क्षमता वाले डिवाइस ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES में CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME शामिल है) को सभी गारंटीकृत स्ट्रीम संयोजनों में Y8 के साथ YUV स्ट्रीम को प्रतिस्थापित करने का समर्थन करना चाहिए।

s720p 720p (1280 x 720) या StreamConfigurationMap.getOutputSizes() द्वारा लौटाए गए विशेष प्रारूप के लिए अधिकतम समर्थित रिज़ॉल्यूशन को संदर्भित करता है। s1440p 1440p (1920 x 1440) या StreamConfigurationMap.getOutputSizes() द्वारा लौटाए गए विशेष प्रारूप के लिए अधिकतम समर्थित रिज़ॉल्यूशन को संदर्भित करता है। जिन डिवाइसों की क्षमताओं में ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE शामिल नहीं है, उन्हें समवर्ती संचालन के दौरान, sVGA रिज़ॉल्यूशन के साथ कम से कम एक Y16 स्ट्रीम, Dataspace::DEPTH समर्थन करना चाहिए, जहां sVGA निम्नलिखित दो रिज़ॉल्यूशन में से छोटा है:

  • दिए गए प्रारूप के लिए अधिकतम आउटपुट रिज़ॉल्यूशन
  • 640 x 480

कार्यान्वयन

ऐप्स को किसी डिवाइस से यह निर्धारित करने के लिए क्वेरी करने की अनुमति देने के लिए कि क्या उसके कैमरे समवर्ती स्ट्रीमिंग का समर्थन करते हैं, ICameraProvider@2.6 HAL इंटरफ़ेस लागू करें, जिसमें निम्नलिखित विधियाँ शामिल हैं:

ICameraProvider@2.6 HAL इंटरफ़ेस के संदर्भ कार्यान्वयन के लिए, EmulatedCameraProviderHWLImpl.cpp पर अनुकरणित कैमरा HAL लाइब्रेरी देखें।

मान्यकरण

यह जांचने के लिए कि इस सुविधा का कार्यान्वयन आपकी इच्छानुसार काम करता है, ConcurrentCameraTest.java CTS परीक्षण का उपयोग करें। इसके अलावा, एक ऐसे ऐप का उपयोग करके परीक्षण करें जो कई कैमरे खोलता है और उन्हें एक साथ संचालित करता है।

संसाधन आवंटन की समस्याएँ

यदि कैमरा एचएएल कैमरा उपकरणों के समवर्ती संचालन के लिए समर्थन का विज्ञापन करते हैं, तो उन्हें संसाधन आवंटन समस्याओं का सामना करना पड़ सकता है, खासकर उस स्थिति में जहां सामने और पीछे (या अन्य) दोनों कैमरों को एक साथ स्ट्रीम करने के लिए फोन पर पर्याप्त इमेज सिग्नल प्रोसेसर (आईएसपी) संसाधन हैं। , लेकिन अपनी पूरी क्षमता से नहीं। इस मामले में, कैमरा एचएएल को प्रत्येक कैमरा डिवाइस के लिए सीमित हार्डवेयर संसाधन आवंटित करने होंगे।

उदाहरण परिदृश्य

निम्नलिखित परिदृश्य इस समस्या को प्रदर्शित करता है।

संकट

डिवाइस में निम्नलिखित कॉन्फ़िगरेशन है:

  • कैमरा आईडी 0 एक विस्तृत और अल्ट्रा-वाइड कैमरे द्वारा समर्थित एक तार्किक कैमरा है, जो प्रत्येक एक आईएसपी संसाधन लेता है।
  • कैमरा आईडी 1 एक ऐसा कैमरा है जो एक आईएसपी संसाधन लेता है।

डिवाइस (फोन) में दो आईएसपी हैं। यदि कैमरा आईडी 0 खोला गया है और एक सत्र कॉन्फ़िगर किया गया है, तो यह संभव है कि कैमरा एचएएल अल्ट्रावाइड और वाइड कैमरा उपयोग दोनों की आशा करते हुए दो आईएसपी आरक्षित करता है।

यदि ऐसा है, तो फ्रंट कैमरा (आईडी 1 ) किसी भी स्ट्रीम को कॉन्फ़िगर नहीं कर सकता क्योंकि दोनों आईएसपी उपयोग में हैं।

समाधान

इस समस्या का समाधान करने के लिए, फ्रेमवर्क सत्रों को कॉन्फ़िगर करने से पहले कैमरा एचएएल को संसाधनों को आवंटित करने के तरीके के बारे में संकेत प्रदान करने के लिए दोनों कैमरा आईडी 0 और 1 खोल सकता है (क्योंकि यह अब कैमरों के समवर्ती संचालन की अपेक्षा करता है)। हालाँकि, इससे सीमित क्षमताएँ हो सकती हैं, उदाहरण के लिए, ज़ूम पूर्ण ज़ूम रेंज अनुपात को संभालने में सक्षम नहीं हो सकता है (क्योंकि भौतिक कैमरा आईडी स्विच करना समस्याग्रस्त हो सकता है)।

इस समाधान को लागू करने के लिए, provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds में निम्नलिखित अपडेट करें।

  • आदेश दें कि कैमरों के समवर्ती संचालन के लिए, कैमरा डिवाइस पर किसी भी सत्र को कॉन्फ़िगर करने से पहले कैमरा फ्रेमवर्क को कैमरा डिवाइस ( @3.2::ICameraDevice::open ) खोलना होगा। यह कैमरा प्रदाताओं को तदनुसार संसाधन आवंटित करने की अनुमति देता है।

  • पूर्ण ज़ूम रेंज अनुपात को संभालने में सक्षम नहीं होने की समस्या का समाधान करने के लिए, सुनिश्चित करें कि कैमरा ऐप्स, जब कैमरे का समवर्ती उपयोग करते हैं, तो पूर्ण ZOOM_RATIO_RANGE के बजाय केवल 1x और MAX_DIGITAL_ZOOM के बीच ZOOM_RATIO नियंत्रण सेटिंग का उपयोग करने की गारंटी दी जाती है (यह स्विचिंग को रोकता है) आंतरिक रूप से भौतिक कैमरे, जिसके लिए संभावित रूप से अधिक आईएसपी की आवश्यकता होती है)।

TestDualCameraPreview के साथ समस्या

जब आप उपरोक्त अपडेट करते हैं, तो यह MultiViewTest.java#testDualCameraPreview परीक्षण द्वारा अनुमत व्यवहार के साथ समस्या पैदा कर सकता है।

परीक्षण testDualCameraPreview सभी कैमरे खोलने के बाद ही सत्र कॉन्फ़िगर नहीं करता है। यह इस क्रम का अनुसरण करता है:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

हालाँकि, यह ERROR_MAX_CAMERAS_IN_USE [1] के साथ कैमरा ओपन विफलताओं को सहन करता है। तृतीय-पक्ष ऐप्स इस व्यवहार पर निर्भर हो सकते हैं।

क्योंकि कैमरा एचएएल को सत्र कॉन्फ़िगर करने से पहले समवर्ती संचालन के लिए खोले जाने वाले कैमरा आईडी के पूरे सेट का पता नहीं चलेगा, इसलिए उसके लिए हार्डवेयर संसाधनों को आवंटित करना कठिन हो सकता है (यह मानते हुए कि उनके लिए कुछ प्रतिस्पर्धा है)।

इस समस्या का समाधान करने के लिए, समवर्ती स्ट्रीमिंग का समर्थन करने के अलावा बैकवर्ड संगतता बनाए रखने के लिए, कैमरा एचएएल को ERROR_MAX_CAMERAS_IN_USE के साथ openCamera कॉल को विफल करना चाहिए यदि वे समवर्ती रूप से चलने वाले सभी कैमरों के लिए पूर्ण स्ट्रीम कॉन्फ़िगरेशन का समर्थन नहीं कर सकते हैं।