Android Camera2 同步图像和元数据

Android Camera2 synchronise image and metadata

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

private final ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(final ImageReader reader) {
        Image previewImage = reader.acquireLatestImage();
        // Use previewImage
    }
};

这是通过将它分配给 setOnImageAvailableListenerImageReader 并在调用 createCaptureSession.

时使用那个 ImageReader 来连接的

同时,还有第二个回调接收 CaptureResult 元数据。

CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() {
    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
        // process(result);
    }
};

这是通过将 previewCallback 传递到捕获会话的 setRepeatingRequestcapture 方法来连接的。

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

两个 TotalCaptureResult and the Image 都带有纳秒时间戳。 保证它们对同一帧具有相同的时间戳。

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

为了稳健性,这需要正确处理可能导致结果或图像丢失的捕获错误,否则您将在队列中拥有永远不会被处理的孤立对象,或者您将拖延整个过程应用程序等待一个永远不会到达的对象。或两者。 一个简单的选择可能是只丢弃超过一秒或两秒的对象。