Android Camera2同步图像和元数据

Android Camera2同步图像和元数据,android,android-camera2,Android,Android Camera2,我有一个使用Android Camera2 API的camera类,当一个帧进入时有两个回调。一个是与接收实际图像像素数据的曲面相关联的回调。在这种情况下 private final ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvai

我有一个使用Android Camera2 API的camera类,当一个帧进入时有两个回调。一个是与接收实际图像像素数据的
曲面相关联的回调。在这种情况下

private final ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(final ImageReader reader) {
        Image previewImage = reader.acquireLatestImage();
        // Use previewImage
    }
};
通过使用
setOnImageAvailableListener
将其分配给一个
ImageReader
,并在调用
createCaptureSession时使用该
ImageReader
将其连接进来。

同时,还有第二个回调,它接收
capturesult
元数据

CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() {
    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
        // process(result);
    }
};
这是通过将previewCallback传递给capture sessions的
setRepeatingRequest
capture
方法连接进来的

问题是如何协调这两个回调,以确保image和CaptureResult引用相同的捕获事件。当然,这对于任何类型的高级再处理都是必要的,例如使用具有不同曝光或焦距设置的图像来创建bokeh或HDR。

和都带有纳秒时间戳。 它们保证对同一帧具有相同的时间戳

所以每次你收到一个,把它放在一个队列或类似的队列中,一旦你有了一个匹配时间戳的对,就把它转发给处理

为了保证健壮性,这需要正确处理捕获错误,这些错误可能会导致结果或图像丢失,否则队列中的孤立对象将永远无法处理,或者整个应用程序将暂停,等待永远无法到达的对象。或者两者兼而有之。
一个简单的选择可能是丢弃超过一秒或两秒的对象。

这似乎就是我想要的。非常感谢。我陷入了从源代码查看SYNC_FRAME_编号的困境,但文档中却没有,不知何故忽略了时间同步。(特别感谢您对健壮性的警告)这是不正确的。看到这个问题,在重复请求的情况下,您无法确定映像的时间戳是否始终等于TotalCaptureResult中相应的时间戳。时间戳将完全匹配,但它们将是不同的映像。TotalCaptureResult将显示完全不同的元数据,而图像的元数据将不同。重复请求与常规捕获没有区别,在比较JPEG EXIF和CaptureResult元数据时,您可能会看到特定于设备的错误,不幸的是,@EddyTalvala没有关于
onCaptureCompleted
onImageAvailable
之前触发的文档,但是在我的测试中,碰巧总是这样。你知道这是否有保证吗?