android camera2将TotalCaptureResult与Frame相关联

时间:2015-03-10 09:33:29

标签: android api camera

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

2 个答案:

答案 0 :(得分:3)

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

  1. TotalCaptureResult保存在CameraCaptureSession.CaptureCallback onCaptureComplete(...)来电中可用的地方。

  2. 然后,当您通过ImageReader.OnAvailableListenerSurfaceTexture.OnFrameAvailableListener提供实际图片时,请获取图片的时间戳:

  3. Long imageTimestamp = Long.valueOf(reader.acquireNextImage().getTimestamp());

    分别为

    Long imageTimestamp = Long.valueOf(surfaceTexture.getTimestamp())

    1. 将时间戳与:imageTimestamp.equals(totalCaptureResult.get(CaptureResult.SENSOR_TIMESTAMP));
    2. 进行比较

      注意:

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

      • 如果您要将图片发送到SurfaceHolder或其他内容,那么您运气不好,因为只发送了像素信息,而不是{{1}中存在的时间戳对象。我不确定您可以发送框架的其他地方,例如ImageMediaRecorder,但我认为不是。

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

答案 1 :(得分:0)

我必须解决类似的情况(跨表面同步帧); Sumner的解决方案(相应收到的Image对象的.getTimestamp())为我SurfaceTextureImageReader做了诀窍。

快速记下其他表面(正如所指出的那样,不会给你Image个对象):至少对于MediaCodecBufferInfo对象收到的onOutputBufferAvailable callback对象{{3}}有一个presentationTimeUs,它是“从使用相应输入缓冲区传入的演示文稿时间戳派生的”,至少在我看来,出现以匹配来自其他时间戳的时间戳表面。 (注意不同的单位。)