【问题标题】:Camera preview is dark using Camera2使用 Camera2 的相机预览很暗
【发布时间】:2018-07-31 16:12:22
【问题描述】:

我正在尝试使用 Camera2 来允许应用拍摄一张简单的照片。我设法使用android-Camera2Basic sample code 获得了一个工作示例,问题是相机预览非常暗(与this other question 相同的问题),在一些答案之后我确实得到了适当的FPS 范围[15、15],将其设置为lockFocus() 方法允许应用以正确的亮度获得清晰的图片并修复来自相机的预览:

private void lockFocus() {
    try {
        // This is how to tell the camera to lock focus.
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range.create(15, 15));

        // Tell #mCaptureCallback to wait for the lock.
        mState = STATE_WAITING_LOCK;
        mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

但是拍照前的预览还是很暗的。我尝试在示例的其他部分设置相同的代码行,但无法正常工作。如何修复它以在预览中获得相同的结果?我正在使用三星 SM-P355M 平板电脑。

【问题讨论】:

    标签: android android-camera2


    【解决方案1】:

    使用下限和上限相等的 FPS 范围,例如 [15,15]、[30,30]、[etc...],将限制 AE 算法可以调整到的范围光线变化,因此可能会产生黑暗的结果。这种类型的范围用于视频录制以保持恒定的 FPS。对于照片,您需要找到一个范围在下限和上限之间分布较宽的范围,例如 [7,30]、[15,25]、[etc...]

    下一个方法可以帮助您找到最佳的 FPS 范围。考虑到它是用于照片而不是视频录制,因为它会丢弃具有相同下限和上限的 FPS 范围。

    (根据您的要求调整 MIN_FPS_RANGEMAX_FPS_RANGE

    @Nullable
    public static Range<Integer> getOptimalFpsRange(@NonNull final CameraCharacteristics characteristics) {
        final int MIN_FPS_RANGE = 0;
        final int MAX_FPS_RANGE = 30;
    
        final Range<Integer>[] rangeList = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
    
        if ((rangeList == null) || (rangeList.length == 0)) {
            Log.e(TAG, "Failed to get FPS ranges.");
            return null;
        }
    
        Range<Integer> result = null;
    
        for (final Range<Integer> entry : rangeList) {
            int candidateLower = entry.getLower();
            int candidateUpper = entry.getUpper();
    
            if (candidateUpper > 1000) {
                Log.w(TAG,"Device reports FPS ranges in a 1000 scale. Normalizing.");
                candidateLower /= 1000;
                candidateUpper /= 1000;
            }
    
            // Discard candidates with equal or out of range bounds
            final boolean discard = (candidateLower == candidateUpper)
                    || (candidateLower < MIN_FPS_RANGE)
                    || (candidateUpper > MAX_FPS_RANGE);
    
            if (discard == false) {
                // Update if none resolved yet, or the candidate
                // has a >= upper bound and spread than the current result
                final boolean update = (result == null)
                        || ((candidateUpper >= result.getUpper()) && ((candidateUpper - candidateLower) >= (result.getUpper() - result.getLower())));
    
                if (update == true) {
                    result = Range.create(candidateLower, candidateUpper);
                }
            }
        }
    
        return result;
    }
    

    【讨论】:

      【解决方案2】:

      经过大量研究后,这个问题没有简单的解决方案(至少在我们相同的硬件上没有),因此我们这次使用已弃用的 Camera Api 实施了新版本的相机活动,一切正常。不是一个真正干净的解决方案,但到目前为止对我有用。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2016-07-03
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      相关资源
      最近更新 更多