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

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 पर जाकर, कैमरे के एचएएल की लाइब्रेरी देखें.

Validation

यह जांच करने के लिए कि इस सुविधा को लागू करने पर, यह ठीक से काम कर रही है या नहीं, 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 के साथ openCamera कॉल को फ़ेल कर देना चाहिए.ERROR_MAX_CAMERAS_IN_USE