这是关于 Android 的 Camera2 API。由于捕获结果和输出帧是异步产生的,因此可以在实际帧之前获得捕获结果。是否有一种将生成的帧与相应的捕获结果相关联的好方法?
最佳答案
假设您正在谈论在捕获时发送到 ImageReader
或 SurfaceTexture
的帧(如无处不在的 camera2basic 示例),诀窍是比较识别图像的唯一时间戳。
TotalCaptureResult
的 CameraCaptureSession.CaptureCallback
调用中可用时,将 onCaptureComplete(...)
保存在可访问的地方。 ImageReader.OnAvailableListener
或 SurfaceTexture.OnFrameAvailableListener
获得时,获取图像的时间戳:Long imageTimestamp = Long.valueOf(reader.acquireNextImage().getTimestamp());
或Long imageTimestamp = Long.valueOf(surfaceTexture.getTimestamp())
,分别。imageTimestamp.equals(totalCaptureResult.get(CaptureResult.SENSOR_TIMESTAMP));
笔记:
SurfaceHolder
或其他东西,那么您就不走运了,因为只发送像素信息,而不是 Image
对象中存在的时间戳。我不确定您可以发送帧的其他地方,例如 MediaRecorder
或 Allocation
,但我认为不是。 TotalCaptureResult
时将它们添加到不断增长的集合中,然后将传入图像的时间戳与所有这些进行比较,因为您注意到了异步性质。我会让你想出如何做到这一点,因为你认为合适。 关于android camera2 将 TotalCaptureResult 与 Frame 关联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28960172/