एक से ज़्यादा क्लाइंट वाले कैमरे चालू करना

एक साथ कई क्लाइंट को किसी कैमरे का ऐक्सेस दिया जा सकता है. इसके लिए, इस पेज पर बताए गए Java और Android NDK सिस्टम एपीआई का इस्तेमाल करें. इससे सिस्टम कैमरा क्लाइंट के साथ ऐक्सेस शेयर किया जा सकेगा.

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

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

    स्ट्रीमिंग के लिए, कैमरा सेवा, डिफ़ॉल्ट कैप्चर अनुरोध पैरामीटर का इस्तेमाल करती है. ये पैरामीटर, झलक दिखाने वाले टेंप्लेट के लिए होते हैं. अगर प्राइमरी क्लाइंट स्ट्रीमिंग कर रहा है, तो सेवा, प्राइमरी क्लाइंट की ओर से तय किए गए कैप्चर अनुरोध पैरामीटर का इस्तेमाल करती है.

शेयर किया गया सेशन कॉन्फ़िगर करना

कैमरा डिवाइस शेयर करने के लिए, शेयर किए गए सेशन का कॉन्फ़िगरेशन, /system_ext/etc/ में मौजूद shared_session_config.xml नाम की फ़ाइल में दें. इस कोड के सैंपल में, कैमरा आईडी 0, दो स्ट्रीम ImageReader और SurfaceView के साथ कैमरा शेयर करने की सुविधा देता है.

<SharedCameraSessionConfigurations colorSpace="-1">
    <!-- colorSpace: ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED -->
    <SharedCameraSessionConfiguration cameraId="0">
        <!-- First OutputConfiguration: All optional fields are provided -->
        <OutputConfiguration>
            <!-- surfaceType: SURFACE_TYPE_IMAGE_READER -->
            <surfaceType>4</surfaceType>
            <width>1920</width>
            <height>1080</height>
            <!-- physicalCameraId is omitted; defaults to "" -->
            <!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
            <streamUseCase>0</streamUseCase>
            <!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
            <timestampBase>0</timestampBase>
            <!-- mirrorMode: MIRROR_MODE_AUTO -->
            <mirrorMode>0</mirrorMode>
            <useReadoutTimestamp>0</useReadoutTimestamp>
            <!-- format: HAL_PIXEL_FORMAT_RGBA_8888 -->
            <format>1</format>
            <!-- usage: AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN -->
            <usage>3</usage>
            <!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
            <dataSpace>0</dataSpace>
        </OutputConfiguration>
        <!-- Second OutputConfiguration: All optional fields are provided -->
        <OutputConfiguration>
            <!-- surfaceType: SURFACE_TYPE_SURFACE_VIEW -->
            <surfaceType>0</surfaceType>
            <width>1920</width>
            <height>1080</height>
            <!-- physicalCameraId is omitted; defaults to "" -->
            <!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
            <streamUseCase>0</streamUseCase>
            <!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
            <timestampBase>0</timestampBase>
            <!-- mirrorMode: MIRROR_MODE_AUTO -->
            <mirrorMode>0</mirrorMode>
            <useReadoutTimestamp>0</useReadoutTimestamp>
            <!-- format: HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED -->
            <format>34</format>
            <!-- usage: AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE|AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY -->
            <usage>256|2048</usage>
            <!-- dataSpace: HAL_DATASPACE_UNKNOWN -->

            <dataSpace>0</dataSpace>
        </OutputConfiguration>
      </SharedCameraSessionConfiguration>
</SharedCameraSessionConfigurations>

शेयर किए गए सेशन के कॉन्फ़िगरेशन के बारे में क्वेरी करने के लिए, क्लाइंट CameraCharacteristics का इस्तेमाल करते हैं. इसके लिए, SHARED_SESSION_CONFIGURATION का इस्तेमाल किया जाता है. शेयर किए गए मोड में कैमरे को ऐक्सेस करने वाले क्लाइंट को, शेयर किए गए सेशन के कॉन्फ़िगरेशन का इस्तेमाल करना होगा. जब क्लाइंट से पास किया गया सेशन कॉन्फ़िगरेशन, शेयर किए गए सेशन कॉन्फ़िगरेशन से मेल नहीं खाता, तब createCaptureSession कॉल पूरा नहीं होता.

Java APIs

CameraManager और CameraDevice, शेयर किए गए मोड में कैमरे खोलने के लिए एपीआई उपलब्ध कराते हैं.

CameraManager API

CameraManager ये एपीआई उपलब्ध कराता है:

  • isCameraDeviceSharingSupported: क्लाइंट इस एपीआई का इस्तेमाल यह पता लगाने के लिए करते हैं कि कोई कैमरा शेयर किए गए मोड के साथ काम करता है या नहीं.

  • openSharedCamera: अगर कोई कैमरा शेयर किए गए मोड के साथ काम करता है, तो क्लाइंट इस एपीआई का इस्तेमाल करके, कैमरे को शेयर किए गए मोड में खोलते हैं.

CameraDevice.StateCallback API

CameraDevice.StateCallback ये एपीआई उपलब्ध कराता है:

  • onOpenedInSharedMode: शेयर किए गए मोड में कैमरा चालू होने पर, क्लाइंट को यह कॉलबैक मिलता है. इस कॉलबैक से पता चलता है कि क्लाइंट, प्राइमरी क्लाइंट है या सेकंडरी क्लाइंट.

  • onClientSharedAccessPriorityChanged: शेयर किया गया सेशन खोलने पर, इस कॉलबैक को तब ट्रिगर किया जाता है, जब किसी क्लाइंट की प्राथमिकता बदल जाती है. ऐसा इसलिए होता है, क्योंकि ज़्यादा प्राथमिकता वाले क्लाइंट ने उसी कैमरे को खोला या बंद किया है.

CameraSharedCaptureSession

CameraSharedCaptureSession क्लास, शेयर किए गए कैप्चर सेशन के बारे में बताती है. शेयर किए गए कैमरा मोड में, सेशन बनाने वाले क्लाइंट को SESSION_SHARED सेशन टाइप का इस्तेमाल करना होगा.

जब सिस्टम कोई सेशन बनाता है, तब CameraCaptureSession को CameraSharedCaptureSession पर कास्ट करें.

सेकंडरी क्लाइंट, createCaptureRequest का इस्तेमाल नहीं कर सकते. इसके बजाय, सेकंडरी क्लाइंट, तय किए गए प्लैटफ़ॉर्म पर स्ट्रीमिंग शुरू करने के लिए startStreaming एपीआई और स्ट्रीमिंग रोकने के लिए stopStreaming एपीआई का इस्तेमाल करते हैं.

Android NDK API

पहले से मौजूद ऐप्लिकेशन, शेयर किए गए मोड में कैमरा खोलने के लिए इन Android NDK एपीआई का इस्तेमाल करते हैं:

शेयर किए गए कैमरों की जांच करना

एक से ज़्यादा क्लाइंट वाले कैमरों के लिए, ये टेस्ट देखें:

पाबंदियां

शेयर किए गए कैमरे के मोड में, ये विकल्प काम नहीं करते:

  • बर्स्ट कैप्चर करने के अनुरोध
  • एक्सटेंशन सेशन
  • तेज़ स्पीड वाले सेशन
  • ऑफ़लाइन सेशन
  • OutputConfiguration को प्लैटफ़ॉर्म के साथ शेयर करने की सुविधा
  • फिर से प्रोसेस किए जा सकने वाले कैप्चर सेशन
  • तीसरे पक्ष के ऐप

जब ज़्यादा प्राथमिकता वाला कोई क्लाइंट, कैमरे को सामान्य मोड में खोलता है, तो सिस्टम, कैमरे को शेयर करने वाले सभी क्लाइंट को हटा देता है.