Android Camera2 在处理帧时拍照

Android Camera2 take picture while processing frames

我正在使用 Camera2 API 创建一个可以扫描条形码并能够在扫描过程中拍照的相机组件。它有点工作,但预览闪烁 - 似乎以前的帧和有时绿色帧正在中断实时预览。

我的代码基于 Google 的 Camera2Basic。我只是再添加一个 ImageReader 及其表面作为 CaptureRequest.Builder 的新输出和目标。 reader 之一使用 JPEG,另一个使用 YUV。当我从输出中移除 JPEG reader 的表面(不将其传递到 createCaptureSession)时,闪烁消失了。

有很多代码,所以我创建了一个要点:click - 试图摆脱完全不相关的代码。

您正在测试的设备是 LEGACY 级别的设备吗?

如果是这样,任何以 JPEG 输出为目标的捕获都可能会慢得多,因为它们可以 运行 预捕获序列,并且还可能短暂地暂停预览。

但它不应该导致绿框,除非存在设备级错误。

如果有人为此苦苦挣扎。 docs 中有 table 表示如果指定了 3 个目标,YUV ImageReader 可以使用最大尺寸等于预览尺寸(最大 1920x1080)的图像。减少这个有帮助!

是的,你可以。假设您将预览配置为将 YUV 帧提供给 ImageReader(因为您也可以将 JPEG 放在那里,检查一下),如下所示:

mImageReaderPreview = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 1);

您可以在 OnImageAvailable 侦听器中处理这些帧:

@Override
public void onImageAvailable(ImageReader reader) {
    Image mImage = reader.acquireNextImage();
    if (mImage == null) {
        return;
    }

    try {

// Do some custom processing like YUV to RGB conversion, cropping, etc.

        mFrameProcessor.setNextFrame(mImage));
        mImage.close();
    } catch (IllegalStateException e) {
        Log.e("TAG", e.getMessage());
}