啟用多重用戶端攝影機

您可以允許多個用戶端同時存取攝影機。如要這麼做,請使用本頁面說明的 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>

如要查詢共用工作階段設定,用戶端會使用 CameraCharacteristics 進行 SHARED_SESSION_CONFIGURATION。以共用模式存取攝影機的用戶端必須使用共用工作階段設定。如果用戶端傳遞的工作階段設定與共用的工作階段設定不符,createCaptureSession 呼叫就會失敗。

Java API

CameraManagerCameraDevice 提供 API,可在共用模式下開啟攝影機。

CameraManager API

CameraManager 提供下列 API:

CameraDevice.StateCallback API

CameraDevice.StateCallback 提供下列 API:

  • onOpenedInSharedMode:在共用模式下開啟攝影機時,用戶端會收到這個回呼。回呼會指出用戶端是主要還是次要用戶端。

  • onClientSharedAccessPriorityChanged:開啟共用工作階段時,如果優先順序較高的用戶端開啟或關閉相同攝影機,導致用戶端優先順序變更,就會觸發這個回呼。

CameraSharedCaptureSession

CameraSharedCaptureSession 類別代表共用的擷取工作階段。在共用攝影機模式中,建立工作階段的用戶端必須使用 SESSION_SHARED 工作階段類型。

系統建立工作階段時,請將 CameraCaptureSession 轉換為 CameraSharedCaptureSession

次要用戶端無法使用 createCaptureRequest。次要用戶端會改用 startStreaming API 在指定介面上開始串流,並使用 stopStreaming API 停止串流。

Android NDK API

內建應用程式會使用下列 Android NDK API,以共用模式開啟相機:

測試共用攝影機

請參閱以下適用於多用戶端攝影機的測試:

限制

共用攝影機模式支援下列選項:

  • 爆發擷取要求
  • 延長工作階段
  • 高速工作階段
  • 離線工作階段
  • OutputConfiguration (透過螢幕分享)
  • 可重新處理的擷取工作階段
  • 第三方應用程式

當優先順序較高的用戶端在一般模式下開啟相機時,系統會逐一移除所有共用相機的用戶端。