android camera2 将 TotalCaptureResult 与 Frame 关联

dam*_*man 4 api camera android

这是关于 Android 的 Camera2 API。由于捕获结果和输出帧是异步产生的,因此可以在实际帧之前获得捕获结果。是否有一种将生成的帧与相应的捕获结果相关联的好方法?

rcs*_*ner 6

假设您正在谈论发送到ImageReaderSurfaceTexture捕获时的帧(如无处不在的camera2basic示例),诀窍是比较识别图像的唯一时间戳。

  1. TotalCaptureResult在您CameraCaptureSession.CaptureCallbackonCaptureComplete(...)通话中可用时将其保存在可访问的地方。

  2. 然后,当实际图像可通过您的ImageReader.OnAvailableListenerorSurfaceTexture.OnFrameAvailableListener获得时,获取图像的时间戳:

Long imageTimestamp = Long.valueOf(reader.acquireNextImage().getTimestamp()); 或者

Long imageTimestamp = Long.valueOf(surfaceTexture.getTimestamp()), 分别。

  1. 将时间戳与: imageTimestamp.equals(totalCaptureResult.get(CaptureResult.SENSOR_TIMESTAMP));

笔记:

  • 时间戳可能不是您设备的实际真实系统时间戳,但它保证唯一且单调递增,因此它可以用作 ID。

  • 如果您将图像发送到 aSurfaceHolder或其他东西,那么您就不走运了,因为只有像素信息被发送,而不是Image对象中存在的时间戳。我不确定您可以发送帧的其他地方,例如,MediaRecorderAllocation,但我认为不是。

  • TotalCaptureResult由于您注意到的异步性质,您可能需要在生成时将每个新添加到不断增长的集合中,然后将传入图像的时间戳与所有这些进行比较。我会让你想出如何做到这一点,因为你认为合适。