这是关于Android的Camera2 API。由于捕获结果和输出帧是异步生成的,因此可以在实际帧之前获取捕获结果。有没有一种方法可以将生成的帧与相应的捕获结果相关联?
答案 0 :(得分:3)
假设您正在讨论在捕获时发送到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));
注意:
时间戳可能不是您设备的实际真实系统时间戳,但保证其唯一且单调递增,因此它可用作ID。
如果您要将图片发送到SurfaceHolder
或其他内容,那么您运气不好,因为只发送了像素信息,而不是{{1}中存在的时间戳对象。我不确定您可以发送框架的其他地方,例如Image
或MediaRecorder
,但我认为不是。
您可能需要在生成集合时将每个新Allocation
添加到不断增长的集合中,然后将传入图像的时间戳与所有这些进行比较,因为您注意到了异步性质。我会让你弄清楚如何做到这一点。
答案 1 :(得分:0)
我必须解决类似的情况(跨表面同步帧); Sumner的解决方案(相应收到的Image对象的.getTimestamp()
)为我SurfaceTexture
和ImageReader
做了诀窍。
快速记下其他表面(正如所指出的那样,不会给你Image
个对象):至少对于MediaCodec
,BufferInfo
对象收到的onOutputBufferAvailable
callback对象{{3}}有一个presentationTimeUs
,它是“从使用相应输入缓冲区传入的演示文稿时间戳派生的”,至少在我看来,出现以匹配来自其他时间戳的时间戳表面。 (注意不同的单位。)