CaptureRequest.SENSOR_FRAME_DURATION 在 Camera2 API 中的用途和使用方法是什么?

What is the purpose and how to use CaptureRequest.SENSOR_FRAME_DURATION in Camera2 API?

当使用 Camera2 API 在 Android 中设置手动控制时,CaptureRequest.SENSOR_FRAME_DURATION 的目的是什么?

documentation我看了好几遍,还是不明白它的用途,以及曝光时间和ISO该设置什么值。

我了解 CaptureRequest.SENSOR_EXPOSURE_TIME 指定了传感器让多少光进入;另外 CaptureRequest.SENSOR_SENSITIVITY 是传感器对光的灵敏度 (ISO),但不知道 SENSOR_FRAME_DURATION 以及它与曝光时间和传感器灵敏度的关系。

比如我设置了1秒或30秒的长曝光时间,那么我在SENSOR_FRAME_DURATION中应该设置什么值呢?它与其他传感器控件有何关系?

FRAME_DURATION与输出帧率是同一个概念。也就是说,图像传感器多久读取一次图像?帧速率通常报告为每秒帧数,而 FRAME_DURATION 是它的倒数 - 单帧的持续时间。

由于 camera2 API 完全是关于 per-frame 控制的,因此将持续时间设置为 per-frame 属性 是合适的。

FRAME_DURATION 不能短于 EXPOSURE_TIME(因为在曝光完成之前您无法从传感器读取图像),但是 API 会为您处理这个问题- 如果您要求 FRAME_DURATION 与 EXPOSURE_TIME 相比太短,它会自动增加。

也就是说,通常您可能需要一致的帧速率(例如视频录制的 30fps),因此您可以将 FRAME_DURATION 设置为 1/30s = 33333333 ns,然后改变 EXPOSURE_TIME 用于手动曝光控制。只要您将 EXPOSURE_TIME 保持在 1/30 秒以内,您将获得稳定的帧率并且仍然具有手动曝光控制。

可能的最短帧持续时间(以及最大帧速率)取决于您在相机捕获会话中要求的输出分辨率和格式。通常,分辨率越高读取时间越长,从而限制了最短帧持续时间。支持 BURST_CAPTURE 相机功能的相机可以处理至少 20fps 的 8 MP 捕获,或更好。

在图像传感器级别,帧持续时间是通过添加额外的垂直消隐时间实现的,因此 EXPOSURE + VBLANK = FRAME_DURATION。全图也更复杂,因为典型的 CMOS 图像传感器可以曝光图像的某些行,而其他行正在被读出(滚动快门),因此实际时序图看起来更复杂。但是,在进行基本的手动曝光控制时,您通常不必关心。

智能phone中的大多数图像传感器都使用滚动快门,逐行读取像素,FRAME_DURATION = FRAME_READ_OUT_TIME + VBLANK