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
कॉल को पूरा नहीं करना चाहिए.