Android --camera2(CameraCharacteristics)

2,303 阅读6分钟

CameraCharacteristics

根据 cameraId 获取对应相机设备的特征。返回一个 CameraCharacteristics,类比于旧 API 中的 Camera.Parameter 类,里面封装了相机设备固有的所有属性功能。
描述 CameraDevice的属性。
这些属性对于给定的CameraDevice 是固定的,可以通过CameraManagerCameraManager#getCameraCharacteristics接口查询。
当由不持有 CAMERA 权限的客户端获取时,不包含某些元数据值。需要权限的密钥列表由 getKeysNeedingPermission()给出。
CameraCharacteristics 对象是不可变的。\

得到

public T get (Key<T> key)

获取相机特性字段值。
字段定义可以在CameraCharacteristics中找到。
多次查询同一个键的值将返回一个等于前一个查询值的值。

getAvailableCaptureRequestKeys

public List<Key<?>> getAvailableCaptureRequestKeys ()

返回此CameraDevice支持的密钥列表,以便使用CaptureRequest进行查询。
返回的列表不可修改,因此任何修改它的尝试都会抛出一个UnsupportedOperationException.
每个键仅在列表中列出一次。键的顺序未定义。
请注意,没有getAvailableCameraCharacteristicsKeys(), 使用 getKeys()

getAvailableCaptureResultKeys

public List<Key<?>> getAvailableCaptureResultKeys ()

返回此CameraDevice支持的键列表,以便使用CaptureResult进行查询。
返回的列表不可修改,因此任何修改它的尝试都会抛出一个UnsupportedOperationException.
每个键仅在列表中列出一次。键的顺序未定义。
请注意,没有getAvailableCameraCharacteristicsKeys()-- 使用 getKeys()。\

getAvailablePhysicalCameraRequestKeys

public List<Key<?>> getAvailablePhysicalCameraRequestKeys ()

返回getAvailableCaptureRequestKeys()键的子集,这些键可以为支持逻辑多摄像头的物理设备覆盖。
这是 android.request.availableRequestKeys 的子集,其中包含可以使用CaptureRequest.Builder#setPhysicalCameraKey覆盖的键列表。可以通过调用CaptureRequest.Builder#getPhysicalCameraKey获取此类请求密钥的相应值 。包含单个物理设备请求的捕获请求必须通过 CameraDevice.createCaptureRequest(int, Set)生成.
返回的列表不可修改,因此任何修改它的尝试都会抛出一个UnsupportedOperationException.
每个键仅在列表中列出一次。键的顺序未定义。\

获取可用会话密钥

public List<Key<?>> getAvailableSessionKeys ()

返回相机设备可以作为捕获会话初始化的一部分传递的getAvailableCaptureRequestKeys()键的子集。
此列表包含难以按帧应用的键,并且在捕获会话生命周期内修改时可能会导致意外延迟。典型示例包括需要耗时的硬件重新配置或内部相机管道更改的参数。出于性能原因,我们建议客户端将其初始值作为SessionConfiguration#setSessionParameters的一部分进行传递。 启用摄像头捕获会话后,还建议避免更改SessionConfiguration#setSessionParameters中设置的初始值。对会话参数的控制仍然可以在捕获请求中使用,但是客户端应该知道,并期望在应用过程中出现延迟。示例使用场景可能如下所示:

  • 相机客户端首先通过getAvailableSessionKeys()查询会话参数键列表 。
  • 在触发捕获会话创建序列之前,必须通过CameraDevice#createCaptureRequest使用与特定用例匹配的适当模板来构建捕获请求。
  • 客户端应该检查会话参数列表并检查列出的某些键是否与他们打算作为第一个捕获请求的一部分修改的参数匹配。
  • 如果没有这样的匹配,捕获请求可以不加修改地传递给SessionConfiguration#setSessionParameters
  • 如果确实存在匹配项,则客户端应更新相应的值并将请求传递给SessionConfiguration#setSessionParameters
  • 捕获会话初始化完成后,会话参数密钥列表可以继续作为发布或更新进一步请求时的参考。如上所述,理想情况下应该避免对会话参数进行进一步更改,如果需要更新,但是客户端可能会在参数切换期间出现延迟/故障。

返回的列表不可修改,因此任何修改它的尝试都会抛出一个UnsupportedOperationException.
每个键仅在列表中列出一次。键的顺序未定义。\

获取密钥

public List<Key<?>> getKeys ()

返回此映射中包含的键的列表。
返回的列表不可修改,因此任何修改它的尝试都会抛出一个UnsupportedOperationException.
从此列表中的键检索到的所有值#get都保证是非null。每个键仅在列表中列出一次。键的顺序未定义

getKeysNeedingPermission

public List<Key<?>> getKeysNeedingPermission ()

返回getKeys()返回的列表的子集,其中包含要求摄影机客户端获取Manifest.permission.camera权限的所有键。
如果应用程序在未持有Manifest.permission.CAMERA权限的情况下,调用CameraManager#getCameraCharacteristics,则此列表中的所有键都将不可用,并且调用get(CameraCharacteristics.Key)将为这些键返回 null。如果应用程序获得了Manifest.permission.CAMERA许可,那么从调用到到后续CameraManager的CameraCharacteristics#getCameraCharacteristics将具有可用的键。
返回的列表不可修改,因此任何修改它的尝试都会抛出一个UnsupportedOperationException.
每个键仅在列表中列出一次。键的顺序未定义。

getPhysicalCameraIds

public Set<String> getPhysicalCameraIds ()

返回此逻辑摄像机设备组成的物理摄像机ID集。
如果相机设备具有 REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA 功能,那么它就是一个逻辑相机。如果相机设备没有能力,返回值将是一个空集。
在API级别29之前,所有返回的ID都保证由CameraManager.getCameraIdList()返回,并且可以由CameraManager#openCamera直接打开。从API级别29开始,对于每个返回的ID,如果它也是由CameraManager#getCameraIdList返回的,则CameraManager#openCamera可以将其用作独立的摄影机。否则,摄像机ID只能用作当前逻辑摄像机的一部分。
返回的集合不可修改,因此任何修改它的尝试都会抛出一个UnsupportedOperationException.

获取推荐的流配置映射

public RecommendedStreamConfigurationMap getRecommendedStreamConfigurationMap (int usecase)

RecommendedStreamConfigurationMap为给定的用例检索相机设备推荐的流配置映射 。
对于预览、视频、快照等常见用例,此处宣传的流配置在功率和性能方面是高效的。推荐的映射通常只是SCALER_STREAM_CONFIGURATION_MAP中提供的详尽列表的一小部分,并由相机设备实现针对特定用例提出建议。\

如,相机客户端如何使用它来找出推荐的最大预览和快照分辨率,请考虑以下伪代码:

 public static Size getMaxSize(Size... sizes) {
     if (sizes == null || sizes.length == 0) {
         throw new IllegalArgumentException("sizes was empty");
     }

     Size sz = sizes[0];
     for (Size size : sizes) {
         if (size.getWidth() * size.getHeight() > sz.getWidth() * sz.getHeight()) {
             sz = size;
         }
     }

     return sz;
 }

 CameraCharacteristics characteristics =
         cameraManager.getCameraCharacteristics(cameraId);
 RecommendedStreamConfigurationMap previewConfig =
         characteristics.getRecommendedStreamConfigurationMap(
                  RecommendedStreamConfigurationMap.USECASE_PREVIEW);
 RecommendedStreamConfigurationMap snapshotConfig =
         characteristics.getRecommendedStreamConfigurationMap(
                  RecommendedStreamConfigurationMap.USECASE_SNAPSHOT);

 if ((previewConfig != null) && (snapshotConfig != null)) {

      Set snapshotSizeSet = snapshotConfig.getOutputSizes(
              ImageFormat.JPEG);
      Size[] snapshotSizes = new Size[snapshotSizeSet.size()];
      snapshotSizes = snapshotSizeSet.toArray(snapshotSizes);
      Size suggestedMaxJpegSize = getMaxSize(snapshotSizes);

      Set previewSizeSet = snapshotConfig.getOutputSizes(
              ImageFormat.PRIVATE);
      Size[] previewSizes = new Size[previewSizeSet.size()];
      previewSizes = previewSizeSet.toArray(previewSizes);
      Size suggestedMaxPreviewSize = getMaxSize(previewSizes);
 }

类似的逻辑也可用于其他用例。
对推荐流配置的支持是可选的。如果没有针对特定用例的建议配置,请参阅 SCALER_STREAM_CONFIGURATION_MAP详尽的可用列表。\