2

基于 Nexus 5x 的非常奇怪的问题。

我有一组普通的相机应用程序表面: - SurfaceHolder 用于屏幕预览 - YUV 格式的 ImageReader 用于预览帧数据 - YUV 或 JPEG 格式的 ImageReader(取决于所选的内部应用程序模式)用于捕获静止图像。

当 JPEG ImageReader 用于配置 captureSession 时,一切正常,屏幕预览正常显示。但是当使用 YUV ImageReader 时,屏幕预览可能会因构图而过度曝光。我必须注意,曝光测光区域设置为传感器的整个 activeRect。

在此屏幕截图中查看:

  1. 正常曝光预览。使用 JPEG ImageReader。 正常曝光预览。 使用 JPEG ImageReader

  2. 曝光过度的预览。使用 YUV ImageReader。 在此处输入图像描述

3&4。JPEG 和 YUV 图像读取器。其他一些构图,现在通常会在这两种情况下公开预览。 在此处输入图像描述在此处输入图像描述

4

1 回答 1

2

最后我找到了那个错误的原因!

您会感到惊讶,但该错误是由捕获会话的表面列表强制执行的。更具体地说,表面的添加顺序到列表中!如果首先添加相机预览表面(SurfaceHolder),则一切正常:

    // prepare list of surfaces to be used in capture requests
    List<Surface> sfl = new ArrayList<Surface>();

    sfl.add(mCameraSurface); // surface for viewfinder preview

    sfl.add(mPreviewImageReader.getSurface()); //preview data
    sfl.add(mImageReader.getSurface()); // surface for image capture

    // configure camera with all the surfaces to be ever used
    camDevice.createCaptureSession(sfl, new sessionListener(), null);

但是当它最后添加时,我们得到了那个错误 - 过度曝光的预览!

// prepare list of surfaces to be used in capture requests
    List<Surface> sfl = new ArrayList<Surface>();

    sfl.add(mPreviewImageReader.getSurface()); //preview data
    sfl.add(mImageReader.getSurface()); // surface for image capture

    sfl.add(mCameraSurface); // surface for viewfinder preview

    // configure camera with all the surfaces to be ever used
    camDevice.createCaptureSession(sfl, new sessionListener(), null);

这让我大吃一惊!

于 2016-04-28T07:17:09.810 回答