背景
当我开始相机预览时,特别是在室内,用takePicture
拍摄的预览框和照片最初是黑暗的。在下一秒,相机的曝光会自动调整,直到曝光达到最佳效果为止。当我打开手机上的摄像头应用程序时,这种行为也会发生。
问题
一旦曝光正确,我想尽快拍张照片。最好我可以注册一个回调,以便在曝光良好时被调用。我该怎么做?
我试过的
发布于 2019-04-25 01:34:11
遗留相机API
不幸的是,带有遗留摄像头驱动程序的设备似乎不支持这一点。因此,最好的选择似乎是启动预览,然后等待大约一秒钟。
camera2
API
使用camera2
API,您可以通过检查CaptureResult.CONTROL_AE_STATE
的值来检查自动曝光状态.
示例代码
第一次开始捕获:
// Auto-exposure only seems to start after the first picture has been taken
// And on the Pixel 3 XL, it finishes fastest when you make a lot of captures
captureSession.setRepeatingRequest(request, captureCallback, null);
并使用此样板代码监视自动曝光:
private CaptureResult firstResult;
private final CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
if (firstResult == null)
firstResult = result;
boolean aeAcquired;
Integer aeState = lastResult.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null) {
// This camera doesn't support monitoring of auto-exposure, so we'll just have to wait a bit and then assume it's adjusted.
long nanosSinceFirstResult = result.get(CaptureResult.SENSOR_TIMESTAMP) - firstResult.get(CaptureResult.SENSOR_TIMESTAMP);
long millisSinceFirstResult = nanosSinceFirstResult / 1000 / 1000;
aeAcquired = millisSinceFirstResult >= 750;
} else {
aeAcquired = aeState == CameraMetadata.CONTROL_AE_STATE_CONVERGED || aeState == CameraMetadata.CONTROL_AE_STATE_FLASH_REQUIRED;
}
if (aeAcquired) {
// Auto-exposure has finished
}
}
};
https://stackoverflow.com/questions/27398570
复制相似问题