Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光

Posted

技术标签:

【中文标题】Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光【英文标题】:Android camera2 exposure issue. Preview is overexposed in case of YUV ImageReader use 【发布时间】:2016-08-19 23:19:00 【问题描述】:

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

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

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

查看此屏幕截图:

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

    曝光过度的预览。使用 YUV ImageReader。

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

【问题讨论】:

【参考方案1】:

我终于找到了那个错误的原因!

您会感到惊讶,但该错误是由捕获会话的表面列表强制执行的。更具体地说,表面的添加顺序到列表中! 如果先添加相机预览表面(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);

这让我大吃一惊!

【讨论】:

以上是关于Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光的主要内容,如果未能解决你的问题,请参考以下文章

Camera2 API - 如何设置长曝光时间

camera2 像素值与传感器曝光时间不成线性关系

如何在camerax中锁定曝光?

使用 Camera2(Android 版本 21)API 录制 60fps 视频

Android使用camera2复制内置视频录制质量和帧率

android.hardware.camera2.CameraAccessException