멀티 클라이언트 카메라 사용 설정

여러 클라이언트가 동시에 카메라에 액세스하도록 설정할 수 있습니다. 이렇게 하려면 이 페이지에 설명된 Java 및 Android NDK 시스템 API를 사용하여 시스템 카메라 클라이언트에 대한 액세스 권한을 공유하세요.

  • 기본 클라이언트: 공유 클라이언트 중 우선순위가 가장 높은 클라이언트입니다. 기본 클라이언트는 캡처 요청을 생성하고 캡처 매개변수를 수정할 수 있습니다.

  • 보조 클라이언트: 기타 모든 공유 클라이언트는 보조 클라이언트입니다. 보조 클라이언트는 캡처 요청을 만들 수 없으며 캡처 매개변수를 수정할 수도 없습니다. 보조 클라이언트는 스트리밍을 시작하거나 중지하는 요청만 보낼 수 있습니다.

    스트리밍의 경우 카메라 서비스는 미리보기 템플릿의 기본 캡처 요청 매개변수를 사용합니다. 기본 클라이언트가 스트리밍하는 경우 서비스는 기본 클라이언트가 지정한 캡처 요청 매개변수를 사용합니다.

공유 세션 구성

카메라 기기를 공유하려면 /system_ext/etc/에 있는 shared_session_config.xml라는 파일에 공유 세션 구성을 제공하세요. 이 코드 샘플에서 카메라 ID 0는 스트림 ImageReaderSurfaceView가 포함된 구성으로 카메라 공유를 지원합니다.

<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>

공유 세션 구성을 쿼리하기 위해 클라이언트는 SHARED_SESSION_CONFIGURATIONCameraCharacteristics를 사용합니다. 공유 모드에서 카메라에 액세스하는 클라이언트는 공유 세션 구성을 사용해야 합니다. 클라이언트에서 전달한 세션 구성이 공유 세션 구성과 일치하지 않으면 createCaptureSession 호출이 실패합니다.

Java API

CameraManagerCameraDevice은 공유 모드에서 카메라를 여는 API를 제공합니다.

CameraManager API

CameraManager는 다음 API를 제공합니다.

  • isCameraDeviceSharingSupported: 클라이언트는 이 API를 사용하여 카메라가 공유 모드를 지원하는지 확인합니다.

  • openSharedCamera: 카메라가 공유 모드를 지원하는 경우 클라이언트는 이 API를 사용하여 공유 모드로 카메라를 엽니다.

CameraDevice.StateCallback API

CameraDevice.StateCallback는 다음 API를 제공합니다.

  • onOpenedInSharedMode: 공유 모드에서 카메라가 열리면 클라이언트가 이 콜백을 수신합니다. 콜백은 클라이언트가 기본 클라이언트인지 보조 클라이언트인지 나타냅니다.

  • onClientSharedAccessPriorityChanged: 공유 세션이 열리면 우선순위가 높은 클라이언트가 동일한 카메라를 열거나 닫았기 때문에 클라이언트의 우선순위가 변경될 때 이 콜백이 트리거됩니다.

CameraSharedCaptureSession

CameraSharedCaptureSession 클래스는 공유 캡처 세션을 나타냅니다. 공유 카메라 모드에서 세션을 만드는 클라이언트는 SESSION_SHARED 세션 유형을 사용해야 합니다.

시스템이 세션을 생성할 때 CameraCaptureSessionCameraSharedCaptureSession로 전송합니다.

보조 클라이언트는 createCaptureRequest을 사용할 수 없습니다. 대신 보조 클라이언트는 startStreaming API를 사용하여 지정된 표시 경로에서 스트리밍을 시작하고 stopStreaming API를 사용하여 스트리밍을 중지합니다.

Android NDK API

기본 제공 앱은 다음 Android NDK API를 사용하여 공유 모드로 카메라를 엽니다.

공유 카메라 테스트

멀티 클라이언트 카메라와 관련된 다음 테스트를 참고하세요.

제한사항

공유 카메라 모드에서는 다음 옵션이 지원되지 않습니다.

  • 버스트 캡처 요청
  • 확장 프로그램 세션
  • 고속 세션
  • 오프라인 세션
  • 표면 공유를 사용한 OutputConfiguration
  • 재처리 가능한 캡처 세션
  • 서드 파티 앱

우선순위가 더 높은 클라이언트가 일반 모드에서 카메라를 열면 시스템은 공유 카메라 클라이언트를 모두 삭제합니다.