เปิดใช้กล้องแบบหลายไคลเอ็นต์

คุณอนุญาตให้ไคลเอ็นต์หลายรายเข้าถึงกล้องพร้อมกันได้ โดยให้ใช้ API ของระบบ Java และ Android NDK ที่อธิบายไว้ในหน้านี้เพื่อแชร์สิทธิ์เข้าถึงไคลเอ็นต์กล้องของระบบ

  • ไคลเอ็นต์หลัก: ไคลเอ็นต์ที่มีลำดับความสำคัญสูงสุดในกลุ่มไคลเอ็นต์ที่แชร์ ไคลเอ็นต์หลัก สามารถสร้างคำขอการจับภาพและแก้ไขพารามิเตอร์การจับภาพได้

  • ไคลเอ็นต์รอง: ไคลเอ็นต์ที่แชร์อื่นๆ ทั้งหมดคือไคลเอ็นต์รอง ไคลเอ็นต์รองจะสร้างคำขอแคปเจอร์หรือแก้ไขพารามิเตอร์แคปเจอร์ไม่ได้ ไคลเอ็นต์รองจะส่งคำขอเพื่อเริ่มหรือหยุด การสตรีมได้เท่านั้น

    สำหรับการสตรีม บริการกล้องจะใช้พารามิเตอร์คำขอแคปเจอร์เริ่มต้น สำหรับเทมเพลตตัวอย่าง หากไคลเอ็นต์หลักกำลังสตรีม บริการจะใช้พารามิเตอร์คำขอแคปเจอร์ที่ไคลเอ็นต์หลักระบุ

กำหนดค่าเซสชันที่แชร์

หากต้องการแชร์อุปกรณ์กล้อง ให้ระบุการกำหนดค่าเซสชันที่แชร์ในไฟล์ ชื่อ shared_session_config.xml ซึ่งอยู่ใน /system_ext/etc/ ในโค้ด ตัวอย่างนี้ กล้องที่มีรหัส 0 รองรับการแชร์กล้องด้วยการกำหนดค่าที่มี สตรีม 2 รายการ ได้แก่ 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 มี API สำหรับเปิดกล้องในโหมดที่แชร์

CameraManager API

CameraManager มี API ดังนี้

  • isCameraDeviceSharingSupported: ไคลเอ็นต์ใช้ API นี้เพื่อตรวจสอบว่ากล้องรองรับโหมดที่แชร์หรือไม่

  • openSharedCamera: หากกล้องรองรับโหมดที่แชร์ ไคลเอ็นต์จะใช้ API นี้เพื่อเปิดกล้องในโหมดที่แชร์

API ของ CameraDevice.StateCallback

CameraDevice.StateCallback มี API ดังนี้

  • onOpenedInSharedMode: ไคลเอ็นต์จะได้รับการเรียกกลับนี้เมื่อเปิดกล้องในโหมดที่แชร์ การเรียกกลับจะระบุว่าไคลเอ็นต์เป็นไคลเอ็นต์หลักหรือรอง

  • onClientSharedAccessPriorityChanged: เมื่อเปิดเซสชันที่แชร์ ระบบจะเรียกใช้การเรียกกลับนี้เมื่อมีการเปลี่ยนลำดับความสำคัญของไคลเอ็นต์เนื่องจาก ไคลเอ็นต์ที่มีลำดับความสำคัญสูงกว่าเปิดหรือปิดกล้องเดียวกัน

CameraSharedCaptureSession

คลาส CameraSharedCaptureSession แสดงถึงเซสชันการจับภาพที่แชร์ ในโหมดกล้องที่ใช้ร่วมกัน ไคลเอ็นต์ที่สร้างเซสชันต้องใช้ประเภทเซสชัน SESSION_SHARED

เมื่อระบบสร้างเซสชัน ให้แคสต์CameraCaptureSessionไปยัง CameraSharedCaptureSession

ไคลเอ็นต์รองจะใช้ createCaptureRequest ไม่ได้ แต่ไคลเอ็นต์รอง จะใช้ API startStreaming เพื่อเริ่มสตรีมบนแพลตฟอร์มที่ระบุ และ API stopStreaming เพื่อหยุดสตรีม

API ของ Android NDK

แอปในตัวใช้ Android NDK API เหล่านี้เพื่อเปิดกล้องในโหมดที่แชร์

ทดสอบกล้องที่แชร์

ดูการทดสอบต่อไปนี้ที่เฉพาะเจาะจงสำหรับกล้องแบบหลายไคลเอ็นต์

ข้อจำกัด

โหมดกล้องที่แชร์ไม่รองรับตัวเลือกต่อไปนี้

  • คำขอการจับภาพแบบต่อเนื่อง
  • เซสชันส่วนขยาย
  • เซสชันความเร็วสูง
  • เซสชันออฟไลน์
  • OutputConfiguration ด้วยการแชร์พื้นผิว
  • เซสชันการจับภาพที่ประมวลผลซ้ำได้
  • แอปของบุคคลที่สาม

เมื่อไคลเอ็นต์ที่มีลำดับความสำคัญสูงกว่าเปิดกล้องในโหมดปกติ ระบบจะนำ ไคลเอ็นต์กล้องที่แชร์ทั้งหมดออก