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

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

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

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

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

टारगेट 1 टारगेट 2
टाइप ज़्यादा से ज़्यादा साइज़ टाइप ज़्यादा से ज़्यादा साइज़ इस्तेमाल के उदाहरण
हां एस1440 पिक्सल इन-ऐप्लिकेशन वीडियो या इमेज प्रोसेसिंग
प्राइवसी एस1440 पिक्सल इन-ऐप्लिकेशन व्यूफ़ाइंडर विश्लेषण
JPEG एस1440 पिक्सल कोई व्यूफ़ाइंडर स्टिल इमेज कैप्चर नहीं है
YUV / खास ऑफ़र एस720 पिक्सल JPEG एस1440 पिक्सल स्टैंडर्ड स्टिल इमेजिंग
YUV / खास ऑफ़र एस720 पिक्सल YUV / खास ऑफ़र एस1440 पिक्सल इन-ऐप्लिकेशन वीडियो या झलक के साथ प्रोसेसिंग

MONOCHROME सुविधा वाले डिवाइस (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES शामिल हैं CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) 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.6HAL इंटरफ़ेस को लागू करने के रेफ़रंस के लिए, यहां देखें सिम्युलेटेड कैमरा एचएएल लाइब्रेरी EmulatedCameraProviderHWLImpl.cpp.

पुष्टि करें

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

संसाधनों के बंटवारे से जुड़े सवाल

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

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

नीचे दिया गया उदाहरण, इस समस्या को दिखाता है.

समस्या

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

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

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

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

समाधान

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

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

  • मैंडेट के मुताबिक कैमरों के एक साथ काम करने के लिए, फ़्रेमवर्क को@3.2::ICameraDevice::open कैमरा डिवाइसों पर किसी भी सेशन को कॉन्फ़िगर करती है. इससे कैमरा ऐक्सेस करने की अनुमति मिलती है देने वालों को उसी के हिसाब से संसाधन असाइन करने होंगे.

  • पूरी तरह से काम न कर पाने की समस्या को हल करने के लिए ज़ूम सीमा अनुपात, पक्का करें कि कैमरे का एक साथ उपयोग करते समय कैमरा ऐप्लिकेशन, ZOOM_RATIO की कंट्रोल सेटिंग को सिर्फ़ 1x से MAX_DIGITAL_ZOOM पूरी ZOOM_RATIO_RANGE के बजाय (यह आंतरिक रूप से कैमरे के स्विच को रोकता है, जो को इंटरनेट सेवा देने वाली अन्य कंपनियों की ज़रूरत है).

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 को सभी कैमरे एक साथ चल रहे हैं.