[英]Camera preview is dark using Camera2
我正在尝试使用Camera2允许应用程序拍摄简单的图片。 我设法使用android-Camera2Basic示例代码获取了一个工作示例,问题是相机预览非常暗(与另一个问题相同),在得到一些答案后,我确实获得了适当的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();
}
}
但是拍照前的预览仍然很黑暗 。 我试图在示例的其他部分中设置同一行代码,但无法正常工作。 我如何解决此问题,以便在预览中获得相同的结果? 我正在使用Samsung SM-P355M平板电脑。
经过大量研究后,再也无法轻松解决此问题(至少不是使用我们的相同硬件),因此这次我们使用不推荐使用的Camera Api实现了新版本的Camera活动,并且一切正常。 这不是一个干净的解决方案,但到目前为止对我来说仍然有效。
使用上限和下限相等的FPS范围(例如[15,15],[30,30],[etc ...])将对AE算法施加限制,使其可以调整多少以适应光线变化,因此可能会产生暗淡的结果。 此类范围用于视频录制以保持恒定的FPS。 对于照片,您需要找到一个上下限较大的范围,例如[7,30],[15,25],[etc ...]
下一种方法可以帮助您找到最佳的FPS范围。 考虑到它只用于照片而不是视频记录,因为它丢弃上下限相等的FPS范围。
(根据您的要求调整MIN_FPS_RANGE和MAX_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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.