我有一个使用Android Camera2 API的camera类,当帧传入时有两个回调。一个是与接收实际图像像素数据的surface相关的回调。在这种情况下
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来实现的
同时,还有第二个接收CaptureResult元数据的回调。
CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
// process(result);
}
};这是通过传递previewCallback来捕获会话的setRepeatingRequest或capture方法实现的。
问题是如何协调两个回调,以确保图像和CaptureResult引用相同的采集事件。当然,这对于任何类型的高级再处理都是必要的,例如使用具有不同曝光或焦点设置的图像来创建bokeh或HDR。
发布于 2019-07-19 07:40:53
TotalCaptureResult和Image都有纳秒时间戳。对于相同的帧,它们保证具有相同的时间戳。
因此,每次您收到一个时,将其放入队列或类似的队列中,一旦您有了具有匹配时间戳的对,就将该对转发到处理。
为了健壮性,这需要正确处理捕获错误,这可能导致结果或图像丢失,否则您将在队列中拥有从未处理过的孤立对象,或者您将使整个应用程序停滞,等待一个永远不会到达的对象。或者两者都有。一个简单的选择可能是只丢弃超过一到两秒的对象。
https://stackoverflow.com/questions/57099350
复制相似问题