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

最佳答案

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

  • TotalCaptureResultCameraCaptureSession.CaptureCallback 调用中可用时,将 onCaptureComplete(...) 保存在可访问的地方。
  • 然后,当实际图像可通过您的 ImageReader.OnAvailableListenerSurfaceTexture.OnFrameAvailableListener 获得时,获取图像的时间戳:
  • Long imageTimestamp = Long.valueOf(reader.acquireNextImage().getTimestamp());
    Long imageTimestamp = Long.valueOf(surfaceTexture.getTimestamp()) ,分别。
  • 比较时间戳: imageTimestamp.equals(totalCaptureResult.get(CaptureResult.SENSOR_TIMESTAMP));

  • 笔记:
  • 时间戳可能不是您设备的实际真实系统时间戳,但它保证唯一且单调递增,因此它可以用作 ID。
  • 如果您将图像发送到 SurfaceHolder 或其他东西,那么您就不走运了,因为只发送像素信息,而不是 Image 对象中存在的时间戳。我不确定您可以发送帧的其他地方,例如 MediaRecorderAllocation ,但我认为不是。
  • 您可能需要在生成每个新的 TotalCaptureResult 时将它们添加到不断增长的集合中,然后将传入图像的时间戳与所有这些进行比较,因为您注意到了异步性质。我会让你想出如何做到这一点,因为你认为合适。
  • 关于android camera2 将 TotalCaptureResult 与 Frame 关联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28960172/

    10-12 03:45