एक साथ कई कैमरों से स्ट्रीम करना

Android, डिवाइसों को कैमरा डिवाइसों की एक साथ स्ट्रीमिंग करने की सुविधा देता है. उदाहरण के लिए, इससे किसी डिवाइस पर सामने और पीछे के दोनों कैमरे एक साथ चालू किए जा सकते हैं. Android 11 से, Camera2 API में ये तरीके शामिल हैं. ऐप्लिकेशन इनका इस्तेमाल करके यह पता लगा सकते हैं कि कैमरे एक साथ स्ट्रीमिंग करने की सुविधा के साथ काम करते हैं या नहीं. साथ ही, यह भी पता लगाया जा सकता है कि कौनसे स्ट्रीम कॉन्फ़िगरेशन काम करते हैं.

  • getConcurrentCameraIds: इससे, फ़िलहाल कनेक्ट किए गए कैमरा डिवाइस के आइडेंटिफ़ायर के ऐसे कॉम्बिनेशन का सेट मिलता है जो एक साथ कैमरा डिवाइस सेशन कॉन्फ़िगर करने की सुविधा देते हैं.
  • isConcurrentSessionConfigurationSupported: इससे यह पता चलता है कि दिए गए कैमरे के डिवाइसों और उनके सेशन के कॉन्फ़िगरेशन को एक साथ कॉन्फ़िगर किया जा सकता है या नहीं.

SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS प्रॉपर्टी में, कैमरा डिवाइस की कैमरा विशेषताओं के ज़रिए, स्ट्रीम के ज़रूरी कॉम्बिनेशन का एक सेट शामिल किया जाता है. एक साथ स्ट्रीम करने के दौरान, इन कॉम्बिनेशन का इस्तेमाल किया जाना ज़रूरी है.

getConcurrentStreamingCameraIds() के ज़रिए विज्ञापन दिखाए जाने वाले हर कैमरे में, एक साथ कई स्ट्रीम चलाने के लिए, यहां दिए गए कॉन्फ़िगरेशन होने चाहिए.

टारगेट 1 टारगेट 2
प्रकार ज़्यादा से ज़्यादा साइज़ प्रकार ज़्यादा से ज़्यादा साइज़ इस्तेमाल के उदाहरण
YUV s1440p ऐप्लिकेशन में वीडियो या इमेज को प्रोसेस करना
PRIV s1440p इन-ऐप्लिकेशन व्यूफ़ाइंडर का विश्लेषण
JPEG s1440p व्यूफ़ाइंडर से इमेज कैप्चर करने की सुविधा उपलब्ध नहीं है
YUV / PRIV s720p JPEG s1440p स्टैंडर्ड स्टिल इमेजिंग
YUV / PRIV s720p YUV / PRIV s1440p ऐप्लिकेशन में वीडियो या झलक के साथ प्रोसेसिंग

MONOCHROME की सुविधा वाले डिवाइसों (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES में CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME शामिल है) पर Y8 फ़ॉर्मैट काम करना चाहिए. साथ ही, सभी स्ट्रीम कॉम्बिनेशन में YUV स्ट्रीम को Y8 से बदलने की सुविधा होनी चाहिए.

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

  • दिए गए फ़ॉर्मैट के लिए, ज़्यादा से ज़्यादा आउटपुट रिज़ॉल्यूशन
  • 640 x 480

लागू करना

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

ICameraProvider@2.6एचएएल इंटरफ़ेस को लागू करने के उदाहरण के लिए, EmulatedCameraProviderHWLImpl.cpp पर जाकर, कैमरे के एचएएल की लाइब्रेरी देखें.

सत्यापन

यह जांच करने के लिए कि इस सुविधा को सही तरीके से लागू किया गया है या नहीं, ConcurrentCameraTest.java सीटीएस टेस्ट का इस्तेमाल करें. साथ ही, ऐसे ऐप्लिकेशन का इस्तेमाल करके टेस्ट करें जो एक साथ कई कैमरे खोलता है और उन्हें एक साथ चलाता है.

संसाधन असाइन करने से जुड़ी समस्याएं

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

उदाहरण के तौर पर

यहां दिए गए उदाहरण में, इस समस्या के बारे में बताया गया है.

समस्या

डिवाइस का कॉन्फ़िगरेशन यह है:

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

डिवाइस (फ़ोन) में दो आईएसपी हैं. अगर कैमरा आईडी 0 चालू है और कोई सेशन कॉन्फ़िगर किया गया है, तो हो सकता है कि कैमरा HAL दो आईएसपी रिज़र्व करे. ऐसा इसलिए किया जाता है, ताकि अल्ट्रावाइड और वाइड, दोनों कैमरों का इस्तेमाल किया जा सके.

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

समाधान

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

इस समाधान को लागू करने के लिए, 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] के साथ कैमरा खोलने में होने वाली गड़बड़ियों को ठीक किया जा सकता है. तीसरे पक्ष के ऐप्लिकेशन, इस व्यवहार पर निर्भर हो सकते हैं.

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

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