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

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 ऐप्लिकेशन में वीडियो या झलक दिखाने के साथ प्रोसेस करना

Y8 के साथ काम करने वाले MONOCHROME की सुविधा वाले डिवाइसों (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES में CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME शामिल है) के लिए, यह ज़रूरी है कि वे 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 एचएएल इंटरफ़ेस लागू करें. इसमें ये तरीके शामिल हैं:

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

पुष्टि करें

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

संसाधनों के बंटवारे से जुड़ी समस्याएं

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

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

इस समस्या के बारे में यहां बताया गया है.

समस्या

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

  • कैमरा आईडी 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] के साथ कैमरा खोलने में आने वाली समस्याओं को सहन किया जाता है. तीसरे पक्ष के ऐप्लिकेशन इस व्यवहार पर निर्भर हो सकते हैं.

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

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