Android P CameraDevice

CameraDevice

CameraDevice类是连接到Android设备的单个摄像头的表示,允许以高帧速率对图像捕获和后处理进行细粒度控制。

您的应用程序必须在其清单中声明Camera权限才能访问摄像头设备。

给定的摄像机设备可以在CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL中定义的几个级别之一提供支持。如果设备支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY级别,则摄像机设备以向后兼容模式运行,并且支持最小的camera2 API。如果设备支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED级别,则Camera2会公开一个与旧版Camera API大致相同的功能集,但界面更清晰,效率更高。如果设备支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL级别,则该设备是可移动摄像头,其提供与CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED级别相似但略少的功能。实现CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL或CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3级别支持的设备相对于旧版相机API提供了显着改进的功能。如果您的应用程序需要一个完整级别的设备才能正常运行,请在manifest中声明“android.hardware.camera.level.full”功能。

 

内部类

  • CameraDevice.StateCallback

 

常量

  • TEMPLATE_MANUAL

public static final int TEMPLATE_MANUAL

用于直接应用程序控制捕获参数的基本模板。 禁用所有自动控制(自动曝光,自动白平衡,自动对焦),并将后处理参数设置为预览质量。 手动捕获参数(曝光,灵敏度等)设置为合理的默认值,但应由应用程序覆盖,具体取决于预期的用例。 保证在支持CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR功能的相机设备上支持此模板。

  • TEMPLATE_PREVIEW

public static final int TEMPLATE_PREVIEW

创建适合相机预览窗口的请求。 具体而言,这意味着高帧率优先于最高质量的后处理。 这些请求通常与CameraCaptureSession #setRepeatingRequest方法一起使用。 所有相机设备都保证支持此模板。

  • TEMPLATE_RECORD

public static final int TEMPLATE_RECORD

创建适合视频录制的请求。 具体地,这意味着使用稳定的帧速率,并且为录制质量设置后处理。 这些请求通常与CameraCaptureSession #setRepeatingRequest方法一起使用。 除了CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT设备(它不是CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE)之外,所有相机设备都支持此模板。

  • TEMPLATE_STILL_CAPTURE

public static final int TEMPLATE_STILL_CAPTURE

创建适合静态图像捕获的请求。 具体而言,这意味着优先考虑帧速率的图像质量。 这些请求通常与CameraCaptureSession#capture方法一起使用。 除了CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT设备(它不是CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE)之外,所有相机设备都支持此模板。

  • TEMPLATE_VIDEO_SNAPSHOT

public static final int TEMPLATE_VIDEO_SNAPSHOT

在录制视频时创建适合静态图像捕获的请求。 具体而言,这意味着在不中断正在进行的录制的情况下最大化图像质量。 这些请求通常与CameraCaptureSession#capture方法一起使用,而基于TEMPLATE_RECORD的请求与CameraCaptureSession#setRepeatingRequest一起使用。 除了旧设备(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)和CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT设备(它不是CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE)之外,所有相机设备都支持此模板。

  • TEMPLATE_ZERO_SHUTTER_LAG

public static final int TEMPLATE_ZERO_SHUTTER_LAG

创建适合零快门滞后仍然捕获的请求。 这意味着最大化图像质量而不影响预览帧速率。 AE / AWB / AF应处于自动模式。 这适用于应用程序操作的ZSL(ZERO SHUTTER LAG)。 对于设备操作的ZSL,请使用CaptureRequest#CONTROL_ENABLE_ZSL(如果可用)。 保证在支持CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING功能或CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING功能的相机设备上支持此模板。

 

公共方法

  • close

public abstract void close ()

尽快关闭与此摄像机设备的连接。

在此调用之后,除了对close()的调用之外,对摄像机设备或活动会话接口的所有调用都将抛出IllegalStateException。 一旦设备完全关闭,将调用StateCallback#onClosed回调,并且可以重新打开摄像机。

在此调用之后,除了最后的StateCallback#onClosed调用之外,不会再发生来自设备或活动会话的回调,并且将丢弃任何剩余的已提交捕获请求,就像已调用CameraCaptureSession#abortCaptures一样,除非没有成功或 将调用失败回调。

  • createCaptureRequest

public CaptureRequest.Builder createCaptureRequest (int templateType, Set<String> physicalCameraIdSet)

为新的捕获请求创建CaptureRequest.Builder,使用模板初始化目标用例。 此方法允许客户端传递物理相机ID,可用于自定义特定物理相机的请求。 选择这些设置是特定逻辑摄像机设备的最佳选项。 如果传递了其他物理相机ID,则它们也将使用相同的设置模板。 客户端可以通过调用CaptureRequest.Builder#setPhysicalCameraKey进一步修改单个摄像头设置。

单个物理相机设置仅适用于使用相应的物理相机ID输出配置OutputConfiguration#setPhysicalCameraId进行初始化的相机会话,并且CaptureRequest.Builder#addTarget也会在请求中附加相同的输出目标。

如果附加有效的物理相机设置,对于任何逻辑相机流输出未定义。

  • createCaptureRequest

public abstract CaptureRequest.Builder createCaptureRequest (int templateType)

为新的捕获请求创建CaptureRequest.Builder,使用模板初始化目标用例。 选择的设置是特定摄像机设备的最佳选项,因此不建议对不同的摄像机设备重复使用相同的请求; 创建特定于该设备和模板的构建器,并根据需要覆盖设置。

  • createCaptureSession

public void createCaptureSession (SessionConfiguration config)

使用SessionConfiguration帮助程序对象创建新的CameraCaptureSession,该对象聚合所有支持的参数。

  • createCaptureSession

public abstract void createCaptureSession (List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler)

通过向摄像机设备提供目标输出Surface集来创建新的摄像机捕获会话。

活动捕获会话为每个捕获请求确定摄像机设备的潜在输出表面集。 给定请求可以使用全部或仅一些输出。 创建CameraCaptureSession后,可以使用CameraCaptureSession#capture,CameraCaptureSession#captureBurst,CameraCaptureSession #setRepeatingRequest或CameraCaptureSession#setRepeatingBurst提交请求。

可以为各种用例和目标创建适合包含为摄像机输出的Surface:

* 对于绘制到SurfaceView:创建SurfaceView的Surface后,使用SurfaceHolder.setFixedSize(int,int)将Surface的大小设置为StreamConfigurationMap#getOutputSizes(Class)返回的大小之一,然后通过调用SurfaceHolder获取Surface.getSurface()。 如果应用程序未设置大小,则摄像机设备将舍入到最接近支持的小于1080p的大小。

* 通过SurfaceTexture访问OpenGL纹理:使用SurfaceTexture.setDefaultBufferSize(int,int)将SurfaceTexture的大小设置为StreamConfigurationMap#getOutputSizes(Class)返回的大小之一,然后使用Surface#Surface从SurfaceTexture创建Surface。 如果应用程序未设置大小,相机设备将将其设置为小于1080p的最小支持大小。

* 使用MediaCodec进行录制:在配置媒体编解码器后调用MediaCodec.createInputSurface()以使用StreamConfigurationMap返回的尺寸之一#getOutputSizes(Class)

* 使用MediaRecorder进行录制:在将介质记录器配置为使用StreamConfigurationMap#getOutputSizes(Class)返回的尺寸之一或将其配置为使用其中一个受支持的CamcorderProfiles之后,调用MediaRecorder.getSurface()。

* 使用android.renderscript进行有效的YUV处理:使用支持的YUV类型,IO_INPUT标志和StreamConfigurationMap#getOutputSizes(Class)返回的大小之一创建RenderScript Allocation,然后使用Allocation.getSurface()获取Surface。

* 要在应用程序中访问RAW,未压缩的YUV或压缩的JPEG数据:使用StreamConfigurationMap#getOutputFormats()提供的支持输出格式之一创建ImageReader对象,通过传递所选输出将其大小设置为相应支持的大小之一 格式化为StreamConfigurationMap#getOutputSizes(int)。 然后使用ImageReader.getSurface()从中获取Surface。 如果ImageReader大小未设置为支持的大小,则摄像机设备将将其舍入为小于1080p的受支持大小。

相机设备将在此调用时查询每个Surface的大小和格式,因此此时必须将它们设置为有效设置。

完成会话配置可能需要几百毫秒,因为相机硬件可能需要打开电源或重新配置。 配置完成并且会话准备好实际捕获数据后,将调用提供的CameraCaptureSession.StateCallback的CameraCaptureSession.StateCallback #onConfigured回调。

如果在调用此方法时已存在先前的CameraCaptureSession,则上一个会话将无法再接受新的捕获请求并将被关闭。 在之前的会话中进行的任何正在进行的捕获请求将在关闭之前完成。 新会话的CameraCaptureSession.StateCallback#onConfigured可能在为先前会话的CameraCaptureSession.StateCallback#onClosed之前调用。 一旦新会话的CameraCaptureSession.StateCallback#onConfigured被调用,它就能够开始捕获自己的请求。 为了最小化转换时间,CameraCaptureSession#abortCaptures调用可用于在创建新的请求之前丢弃先前捕获会话的剩余请求。 请注意,一旦创建了新会话,旧会话就不能再中止其捕获。

使用更大分辨率的输出或更多输出会导致设备的输出速率变慢。

使用空列表或空列表配置会话将关闭当前会话(如果有)。 这可用于释放当前会话的目标Surface以供其他用途。

虽然可以在配置单个输出流时使用StreamConfigurationMap#getOutputSizes中的任何大小,但是当一次配置多个输出时,给定的摄像机设备可能无法支持大小,格式和目标的所有组合。 根据摄像机设备的功能,下表列出了流和目标组合的最大保证分辨率。

如果应用程序尝试使用超出下表中所述限制的一组目标创建会话,则可能会出现三种可能性之一。 首先,可以成功创建会话并正常工作。 其次,可以成功创建会话,但是相机设备将不满足StreamConfigurationMap#getOutputMinFrameDuration中描述的帧速率保证。 或者第三,如果根本无法使用输出集,则会调用CameraCaptureSession.StateCallback#onConfigureFailed来完成会话创建。

对于Type列

PRIV指的是使用StreamConfigurationMap找到可用大小的任何目标#getOutputSizes(Class),没有直接的应用程序可见格式;

YUV指的是使用ImageFormat.YUV_420_888格式的目标Surface;

JPEG指的是ImageFormat.JPEG 格式;

RAW指的是ImageFormat.RAW_SENSOR格式;

对于Max size列

PREVIEW指的是与设备屏幕分辨率匹配的最佳尺寸,或者指1080p(1920x1080),以较小者为准;

RECORD指摄像机设备的最大支持录制分辨率,由CamcorderProfile确定;

MAXIMUM是指StreamConfigurationMap#getOutputSizes中相机设备对该格式或目标的最大输出分辨率;

要使用这些表,请确定所需输出的数量和格式/目标,并找到包含这些目标的表的行。 尺寸表示可以使用的最大尺寸集; 保证对于这些目标,可以成功地使用StreamConfigurationMap#getOutputSizes给出的列表中列出的大小和任何小的值来创建会话。 例如,如果一行指示800万像素(MP)YUV_420_888输出可以与2 MP PRIV输出一起使用,则可以创建具有目标[8 MP YUV,2 MP PRIV]或目标[2 MP YUV,2 MP PRIV]的会话 ; 但是目标[8 MP YUV,4 MP PRIV],目标[4 MP YUV,4 MP PRIV]或目标[8 MP PRIV,2 MP YUV]的会话将无法保证工作,除非其他一些行 表列出了这样的组合。

旧设备(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)至少支持以下流组合:

LEGACY-level 保障的配置
Target 1Target 2Target 3示例用例
TypeMax sizeTypeMax sizeTypeMax size
PRIVMAXIMUM  简单预览,GPU视频处理或无预览视频录制。
JPEGMAXIMUM  无取景器的静止图像捕捉。
YUVMAXIMUM  应用内视频/图像处理。
PRIVPREVIEWJPEGMAXIMUM 标准静止成像。(也就是通常说的拍照)
YUVPREVIEWJPEGMAXIMUM 应用内处理加上静止图像捕获。
PRIVPREVIEWPRIVPREVIEW 标准录像。
PRIVPREVIEWYUVPREVIEW 预览加上应用内处理。 
PRIVPREVIEWYUVPREVIEWJPEGMAXIMUM静止成像加上应用内处理。

Limited-level (CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)设备除了支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY设备之外,还支持至少以下流组合:

LIMITED-level 额外保障的配置
Target 1Target 2Target 3Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax size
PRIVPREVIEWPRIVRECORD 具有预览功能的高分辨率视频录制。
PRIVPREVIEWYUVRECORD 具有预览功能的高分辨率应用内视频处理。
YUVPREVIEWYUVRECORD 双输入应用内视频处理。
PRIVPREVIEWPRIVRECORDJPEGRECORD带视频快照的高分辨率录制。
PRIVPREVIEWYUVRECORDJPEGRECORD具有视频快照的高分辨率应用内处理。
YUVPREVIEWYUVPREVIEWJPEGMAXIMUM具有静态捕获功能的双输入应用内处理。

FULL-level(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL)除了支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED设备之外,还至少支持以下流组合:

FULL-level 额外保障的配置
Target 1Target 2Target 3Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax size
PRIVPREVIEWPRIVMAXIMUM 具有预览功能的最大分辨率GPU处理。
PRIVPREVIEWYUVMAXIMUM 具有预览功能的最大分辨率应用内处理。
YUVPREVIEWYUVMAXIMUM 最大分辨率双输入应用程序内处理。
PRIVPREVIEWPRIVPREVIEWJPEGMAXIMUM具有最大尺寸视频快照的视频录制
YUV640x480PRIVPREVIEWYUVMAXIMUM标准视频录制以及最大分辨率的应用内处理。
YUV640x480YUVPREVIEWYUVMAXIMUM预览加上双输入最大分辨率应用程序内处理。

RAW-capability (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES包括CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_RAW)设备还在CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL和CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED设备上至少支持以下流组合:

RAW-capability 额外保障的配置
Target 1Target 2Target 3Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax size
RAWMAXIMUM  无预览的DNG捕获。
PRIVPREVIEWRAWMAXIMUM 标准DNG捕获。
YUVPREVIEWRAWMAXIMUM 应用内处理加DNG捕获。
PRIVPREVIEWPRIVPREVIEWRAWMAXIMUM伴随DNG捕获录制视频。
PRIVPREVIEWYUVPREVIEWRAWMAXIMUM使用应用内处理进行预览和DNG捕获。
YUVPREVIEWYUVPREVIEWRAWMAXIMUM双输入应用内处理和DNG捕获。
PRIVPREVIEWJPEGMAXIMUMRAWMAXIMUM使用JPEG和DNG的静态捕获。
YUVPREVIEWJPEGMAXIMUMRAWMAXIMUM同时使用JPEG和DNG进行应用内处理。

BURST-capability(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES包括CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE)设备除了支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED设备之外,还支持至少以下流组合。 请注意,所有FULL-level设备都支持BURST功能,以下列表是FULL-level设备列表的严格子集,因此该表仅与支持BURST_CAPTURE功能的LIMITED级设备相关。

BURST-capability 额外保障的配置
Target 1Target 2Sample use case(s)
TypeMax sizeTypeMax size
PRIVPREVIEWPRIVMAXIMUM具有预览功能的最大分辨率GPU处理。
PRIVPREVIEWYUVMAXIMUM具有预览功能的最大分辨率应用内处理。
YUVPREVIEWYUVMAXIMUM最大分辨率双输入应用程序内处理。

LEVEL-3(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3)除了CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL和RAW功能(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES包括CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_RAW)的组合之外,至少支持以下流组合:

LEVEL-3 额外保障的配置
Target 1Target 2Target 3Target 4Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax sizeTypeMax size
PRIVPREVIEWPRIV640x480YUVMAXIMUMRAWMAXIMUM使用动态选择输出格式的应用内取景器分析。
PRIVPREVIEWPRIV640x480JPEGMAXIMUMRAWMAXIMUM使用动态选择输出格式的应用内取景器分析。

MONOCHROME功能(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES包括CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME)的设备在硬件级别上支持Y8支持在所有保证流组合中用Y8替换YUV流。

客户端可以通过MandatoryStreamCombination访问上述强制流组合表。

由于摄像机设备的功能差别很大,因此给定的摄像机设备可能支持具有这些保证之外的大小的目标组合,但这只能通过调用isSessionConfigurationSupported(SessionConfiguration)或尝试创建具有此类目标的会话来测试。

176x144(QCIF)分辨率的例外情况:摄像机设备通常具有从较大分辨率缩小到较小分辨率的固定功能,并且由于具有高分辨率图像传感器的设备的这种限制,有时不能完全支持QCIF分辨率。 因此,可能不支持尝试将QCIF分辨率流与大于1920x1080分辨率(宽度或高度)的任何其他流一起配置,并且如果不支持的话,则捕获会话创建将失败。

  • createCaptureSessionByOutputConfigurations

public abstract void createCaptureSessionByOutputConfigurations (List<OutputConfiguration> outputConfigurations, CameraCaptureSession.StateCallback callback, Handler handler)

通过向摄像机设备提供Surface的目标输出集及其相应的Surface配置,创建新的摄像机捕获会话。

  • createConstrainedHighSpeedCaptureSession

public abstract void createConstrainedHighSpeedCaptureSession (List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler)

创建一个新的约束高速捕获会话。

如果CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES公布了所需的高速FPS范围,则应用程序可以使用正常捕获会话(通过createCaptureSession(SessionConfiguration)创建)进行高速捕获,在这种情况下,适用于正常捕获会话相关的所有API语义。

该方法创建专门的捕获会话,其仅针对高速视频记录(> = 120fps)用例,如果相机设备支持高速视频能力(即,CameraCharacteristics #REQUEST_AVAILABLE_CAPABILITIES包含CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO)。 因此,与普通捕获会话相比,它具有特殊的特性:

* 除了createCaptureSession(SessionConfiguration)方法指定的输出目标Surface要求之外,活动高速捕获会话将支持最多2个输出Surface,尽管应用程序可能选择仅配置一个Surface(例如,仅预览)。 所有Surfaces必须是视频编码器Surface(由MediaRecorder.getSurface()或MediaCodec.createInputSurface()获取)或预览Surface(通过Surface.Surface(android.graphics.SurfaceTexture)从SurfaceView,SurfaceTexture获得)。 Surface大小必须是StreamConfigurationMap#getHighSpeedVideoSizes报告的大小之一。 配置多个Surface时,它们的大小必须相同。

* 活动高速捕获会话仅接受通过CameraConstrainedHighSpeedCaptureSession #createHighSpeedRequestList创建的请求列表,并且请求列表只能通过CameraCaptureSession#captureBurst或CameraCaptureSession #setRepeatingBurst提交给此会话。

* 本次会议要求的FPS范围必须从StreamConfigurationMap#getHighSpeedVideoFpsRangesFor中选择。应用程序仍然可以使用CaptureRequest#CONTROL_AE_TARGET_FPS_RANGE来控制所需的FPS范围。切换到具有不同最大FPS的FPS范围可能触发一些相机设备重新配置,这可能引入额外的延迟。建议应用程序在高速流式传输过程中尽可能避免不必要的最大目标FPS变化。

* 对于提交到此会话的请求列表,摄像机设备将分别覆盖CaptureRequest#CONTROL_MODE,自动曝光(AE),自动白平衡(AWB)和自动对焦(AF)到CameraMetadata#CONTROL_MODE_AUTO,CameraMetadata#CONTROL_AE_MODE_ON,CameraMetadata #CONTROL_AWB_MODE_AUTO和CameraMetadata#CONTROL_AF_MODE_CONTINUOUS_VIDEO。所有后处理块模式控件都将被覆盖为FAST。因此,不可能手动控制捕获和后处理参数。除此之外,只有一部分控件可以使用,有关详细信息,请参阅CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO。

  • createReprocessCaptureRequest

public abstract CaptureRequest.Builder createReprocessCaptureRequest (TotalCaptureResult inputResult)

从TotalCaptureResult为新的reprocess  CaptureRequest创建CaptureRequest.Builder。

每个reprocess CaptureRequest处理一个缓冲区,这个缓冲区从CameraCaptureSession的输入Surface到包含在reprocess 捕获请求中所有输出Surface。这个reprocess输入图像必须由从同一相机设备捕获的一个或多个输出图像生成。应用程序可以通过ImageWriter.queueInputImage(Image)向摄像机设备提供输入图像。应用程序必须使用其中一个输出图像的捕获结果来创建reprocess捕获请求,以便摄像机设备可以使用该信息来实现最佳的reprocess图像质量。对于仅支持1个输出Surface的相机设备,提交具有多个输出目标的重新处理CaptureRequest将导致CaptureFailure。

  • createReprocessableCaptureSession

public abstract void createReprocessableCaptureSession (InputConfiguration inputConfig, List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler)

通过向摄像机设备提供所需的reprocessing输入Surface配置和Surface的目标输出集,创建新的可重新处理的摄像机捕获会话。

如果摄像机设备支持YUV重新处理(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING)或PRIVATE重新处理(CameraCharacteristics #REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING),除了通过createCaptureSession创建的捕获会话之外,应用程序还可以创建可重新处理的捕获会话,以提交除常规捕获请求之外的重新捕获请求。重新处理捕获请求从会话的输入Surface获取下一个可用缓冲区,并再次通过摄像机设备的处理管道发送它,为请求的目标输出Surfaces生成缓冲区。没有为重新处理请求捕获新的图像数据。然而,由应用程序提供的输入缓冲器必须由相同会话中的相同相机设备直接捕获(例如,对于零快门 - 滞后使用情况)或间接(例如,组合多个输出图像)。

活动的可重新处理的捕获会话为每个捕获请求确定摄像机设备的输入Surface和潜在输出Surface的集合。应用程序可以使用createCaptureRequest创建常规捕获请求以从摄像头设备捕获新图像,并使用createReprocessCaptureRequest创建重新处理捕获请求以处理来自输入Surface的缓冲区。某些会话中输出Surface的组合可能不会同时在请求中使用。可以在请求中同时使用的输出Surface的受到保障的组合列在createCaptureSession下的表中。一个捕获请求中的所有输出Surface将来自相同的源,可以来自相机设备的新捕获,也可以来自输入Surface,具体取决于请求是否是重新捕获请求。

可以通过StreamConfigurationMap#getInputFormats和StreamConfigurationMap#getInputSizes查询摄像机设备支持的输入格式和大小。对于每种支持的输入格式,摄像机设备支持一组用于重新处理的输出格式和大小,可通过StreamConfigurationMap#getValidOutputFormatsForInput和StreamConfigurationMap#getOutputSizes查询。虽然输出Surface的格式不是输入配置的有效重新处理输出目标,但它们可以是会话的一部分,它们不能用作重新处理请求的目标。

由于应用程序无法直接访问ImageFormat.PRIVATE图像,因此ImageReader.newInstance(int,int,int,int)以ImageFormat.PRIVATE格式创建的输出Surface将被视为用于重新处理输入,从而用于ImageReader size必须与ImageFormat.PRIVATE格式支持的输入大小之一匹配。 否则,创建可重新处理的捕获会话将失败。

createCaptureSession中列出的保障流配置也保证适用于createReprocessableCaptureSession。此外,如果摄像机设备支持YUV重新处理或PRIVATE重新处理,则下表中的配置同样保证可用于创建可重新处理的捕获会话。但是,并非用于创建可重新处理会话的所有输出目标都可以同时用于CaptureRequest。但是,并非用于创建可重新处理会话的所有输出目标都可以同时用于CaptureRequest。对于在重新处理CaptureRequest中仅支持1个输出目标的设备,提交具有多个输出目标的重新处理CaptureRequest将导致CaptureFailure。对于在重新处理CaptureRequest中支持多个输出目标的设备,可以同时包含在CaptureRequest中的保证输出目标列在createCaptureSession下的表中。例如,使用支持PRIVATE重新处理的FULL功能(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL)设备,应用程序可以使用1个输入(PRIV,MAXIMUM)和3个输出创建可重新处理的捕获会话(PRIV,MAXIMUM) ),(PRIV,PREVIEW)和(YUV,MAXIMUM)。但是,不能保证应用程序可以根据createCaptureSession下列出的表提交带有(PRIV,MAXIMUM)和(YUV,MAXIMUM)输出的常规的或重新处理的捕获。换句话说,使用下表确定用于创建可重新处理的捕获会话的保证流配置,并使用createCaptureSession下的表来确定可以在常规或重新处理CaptureRequest中同时提交的保证输出目标。

LIMITED-level(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)设备除了支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED设备的createCaptureSession中列出的那些流组合外至少支持以下流组合,用于创建可重新处理的捕获会话:

LIMITED-level additional guaranteed configurations for creating a reprocessable capture session
(PRIV input is guaranteed only if PRIVATE reprocessing is supported. YUV input is guaranteed only if YUV reprocessing is supported)
InputTarget 1Target 2Target 3Target 4Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax sizeTypeMax sizeTypeMax size
PRIV/YUVMAXIMUMSame as inputMAXIMUMJPEGMAXIMUM    无取景器静止图像处理。
PRIV/YUVMAXIMUMSame as inputMAXIMUMPRIVPREVIEWJPEGMAXIMUM  ZSL(Zero-Shutter-Lag)静止成像。
PRIV/YUVMAXIMUMSame as inputMAXIMUMYUVPREVIEWJPEGMAXIMUM  ZSL静止成像和应用程序处理成像。
PRIV/YUVMAXIMUMSame as inputMAXIMUMYUVPREVIEWYUVPREVIEWJPEGMAXIMUMZSL应用内处理伴随静止捕获。

FULL-level(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL)设备除了支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED设备之外至少支持以下用于创建可重新处理的捕获会话的流组合:

FULL-level additional guaranteed configurations for creating a reprocessable capture session
(PRIV input is guaranteed only if PRIVATE reprocessing is supported. YUV input is guaranteed only if YUV reprocessing is supported)
InputTarget 1Target 2Target 3Target 4Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax sizeTypeMax sizeTypeMax size
YUVMAXIMUMYUVMAXIMUMPRIVPREVIEW    最大分辨率多帧图像融合应用内处理,伴随预览。
YUVMAXIMUMYUVMAXIMUMYUVPREVIEW    最大分辨率多帧图像融合双输入应用内处理。
PRIV/YUVMAXIMUMSame as inputMAXIMUMPRIVPREVIEWYUVRECORD  高分辨率ZSL应用内视频处理,定期预览。
PRIVMAXIMUMPRIVMAXIMUMPRIVPREVIEWYUVMAXIMUM  具有常规预览的最大分辨率ZSL应用内处理。
PRIVMAXIMUMPRIVMAXIMUMYUVPREVIEWYUVMAXIMUM  最大分辨率双输入ZSL应用程序内处理。
PRIV/YUVMAXIMUMSame as inputMAXIMUMPRIVPREVIEWYUVPREVIEWJPEGMAXIMUMZSL静态捕获和应用内处理。

RAW功能(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES包括CameraMetadata #REQUEST_AVAILABLE_CAPABILITIES_RAW)设备还至少支持以下流组合,用于在CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL和CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED设备上创建可重新处理的捕获会话。

RAW-capability additional guaranteed configurations for creating a reprocessable capture session
(PRIV input is guaranteed only if PRIVATE reprocessing is supported. YUV input is guaranteed only if YUV reprocessing is supported)
InputTarget 1Target 2Target 3Target 4Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax sizeTypeMax sizeTypeMax size
PRIV/YUVMAXIMUMSame as inputMAXIMUMYUVPREVIEWRAWMAXIMUM  互斥的ZSL应用内处理和DNG捕获。
PRIV/YUVMAXIMUMSame as inputMAXIMUMPRIVPREVIEWYUVPREVIEWRAWMAXIMUM相互独立的ZSL应用内处理和DNG捕获的预览。
PRIV/YUVMAXIMUMSame as inputMAXIMUMYUVPREVIEWYUVPREVIEWRAWMAXIMUM互斥的ZSL双输入应用内处理和DNG捕获。
PRIV/YUVMAXIMUMSame as inputMAXIMUMPRIVPREVIEWJPEGMAXIMUMRAWMAXIMUM互斥的ZSL静态捕获和DNG捕获的预览。
PRIV/YUVMAXIMUMSame as inputMAXIMUMYUVPREVIEWJPEGMAXIMUMRAWMAXIMUM具有静态捕获和DNG捕获功能的互斥式ZSL应用内处理。

LEVEL-3(CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL == CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_3)设备除了支持CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL设备之外,还支持至少以下用于创建可重新处理的捕获会话的流组合。 请注意,虽然第二个配置允许同时配置MAXIMUM YUV和JPEG输出,但不会为常规捕获会话列出该配置,因此不允许同时输出到两个目标。

LEVEL-3 additional guaranteed configurations for creating a reprocessable capture session
(PRIV input is guaranteed only if PRIVATE reprocessing is supported. YUV input is always guaranteed.
InputTarget 1Target 2Target 3Target 4Target 5Sample use case(s)
TypeMax sizeTypeMax sizeTypeMax sizeTypeMax sizeTypeMax sizeTypeMax size
YUVMAXIMUMYUVMAXIMUMPRIVPREVIEWPRIV640x480RAWMAXIMUM  使用ZSL和RAW进行应用内取景器分析。
PRIV/YUVMAXIMUMSame as inputMAXIMUMPRIVPREVIEWPRIV640x480RAWMAXIMUMJPEGMAXIMUM使用ZSL,RAW和JPEG重新处理输出的应用内取景器分析。
  • createReprocessableCaptureSessionByConfigurations

public abstract void createReprocessableCaptureSessionByConfigurations (InputConfiguration inputConfig, List<OutputConfiguration> outputs, CameraCaptureSession.StateCallback callback, Handler handler)

通过提供所需的重新处理输入配置并将OutputConfiguration输出到摄像机设备,创建新的可重新处理的摄像机捕获会话。

  • getId

public abstract String getId ()

获取此摄像头设备的ID。

这与CameraManager#openCamera的ID匹配,以实例化此摄像机设备。

此ID可用于通过CameraManager#getCameraCharacteristics查询摄像机设备的CameraCharacteristics。

即使设备已关闭或遇到严重错误,也可以调用此方法。

  • isSessionConfigurationSupported

public boolean isSessionConfigurationSupported (SessionConfiguration sessionConfig)

检查摄像机设备是否支持特定的SessionConfiguration。

此方法执行给定SessionConfiguration的运行时检查。 结果确认是否可以使用CameraDevice #createCaptureSession(SessionConfiguration)成功使用传递的会话配置来创建摄像头捕获会话。

可以在活动捕获会话之前,期间和之后的任何时刻调用该方法。 它不得以任何方式影响正常的摄像机行为,并且必须比创建常规或受约束的捕获会话快得多。

虽然此方法比创建新的捕获会话更快,但它并不打算用于探索支持的流组合的整个空间。 可用的强制流组合MandatoryStreamCombination更适合此目的。

请注意,将忽略会话参数,并且不需要调用SessionConfiguration#setSessionParameters。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值