因为项目的原因,最近在纠结在
控制曝光
的情况下,
帧率调整
的问题,中途查了些资料,在这里记录一下自己的理解,有不对还烦请指正~
想要达到的效果大概是,在曝光一定(符合项目需求)的情况下,获取
最大帧率
。
首先,要控制是否自动曝光,也就是
CONTROL_AE_MODE
这个参数。如果这个模式是
ON
的,帧率控制就可以由
CONTROL_AE_TARGET_FPS_RANGE
来控制,如下列代码所示:
Range<Integer> maxFps;
fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
if(fpsRanges != null && fpsRanges.length > 0) {
maxFps = fpsRanges[0];
for (Range<Integer> aFpsRange : fpsRanges) {
if (maxFps.getLower() * maxFps.getUpper() < aFpsRange.getLower() * aFpsRange.getUpper()) {
maxFps = aFpsRange;
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, maxFps);
但是呢,由于我们需要控制曝光,所以以上无效了。我们需要把CONTROL_AE_MODE设置为OFF,这时候,以下三个参数就能够使用了。
| 参数名称 | 描述 |
|---|
| SENSOR_EXPOSURE_TIME | 每个像素曝光的时长(单位:ns)。 如果不能达到指定时长,就缩短至最接近的可能值。最终结果在CaptureResult中查看。有效范围通过SENSOR_INFO_EXPOSURE_TIME_RANGE获取。 |
| SENSOR_FRAME_DURATION | 从某一帧曝光开始到下一帧曝光开始的时长(单位:ns) 该项影响因素较多,不过所支持的最大帧率可以通过public long getOutputMinFrameDuration (int format, Size size)得到。 |
| SENSOR_SENSITIVITY | 处理前应用于传感器数据的增益量,用的是标准的ISO感光度(ISO 12232:2006) 有效范围通过SENSOR_INFO_SENSITIVITY_RANGE获取。 |
先创建一个StreamConfigurationMap对象map,然后调用getOutputMinFrameDuration(int format, Size size)来获取minFrameDuration。
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mPreviewSize = getOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height);
minFrameDuration=map.getOutputMinFrameDuration(ImageFormat.YUV_420_888,mPreviewSize);
System.out.println("minFrameRate:"+minFrameDuration);
最后输出的minFrameDuration为50000000ns,也就是只有20fps。
不过通过其他方法查看,感觉其实只有15fps,还是不知道问题具体出在哪儿,或许和曝光时长之类的也有点关系吧。
通过 CameraDevice 对象的 createCaptureRequest() 方法得到一个 CaptureRequest.Builder 实例,再用set()进行各种配置。
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 0);
mCaptureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long) 1000);
mCaptureRequestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, minFrameDuration);
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_MODE, 0);
参数还没调整好,先记录着,调整完毕后再来修改~
而且发现曝光补偿EVCONTROL_AE_EXPOSURE_COMPENSATION其实也影响曝光效果,不过这应该是影响自动曝光算法的。
1.Android Developers | Camera2 API
2.第34讲 Android Camera2 API AE手动曝光
因为项目的原因,最近在纠结在控制曝光的情况下,帧率调整的问题,中途查了些资料,在这里记录一下自己的理解,有不对还烦请指正~控制曝光的相关参数首先,要控制是否自动曝光,也就是CONTROL_AE_MODE这个参数。如果这个模式是ON的,帧率控制就可以由CONTROL_AE_TARGET_FPS_RANGE来控制,如下列代码所示:Range<Integer> maxFps;fpsRanges = characteristics.get(CameraCharacteristics.CONTR
Camera2相机在暗光环境里,发现画面非常暗,而系统自带的相机渲染的画面还算不错,调了很久发现是设置了帧率的原因。
设置帧率时,建议选最大与最小都是最大的,如5~30帧,如果只选30帧,则即使在暗光环境下依旧无法自动曝光:
try {
//自动聚焦
// mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
首先,打开3A的总开关:
CaptureRequest.Builder builder.set(CaptureRequest.CONTROL_MODE,
CameraMetadata.CONTROL_MODE_AUTO);
然后,设置FPS:
builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, ae_target_fps_range);
最后,根据 Flash_Mode 设置 AE_MODE
switch(flash_value) {
本讲是Android Camera专题系列的第32讲,我们介绍Android Camera2 API专题的AE自动曝光第2部分,AE自动曝光包括如下内容,第二部分介绍后5章节:
AE是什么
3A总开关
拍照前AE测光
曝光补偿(EV)
AE Lock
AE状态转换
AE测光区域
帧率控制
视频在线观看:
视频观看:
加入知识星球与更多Camera同学交流
– 星球名称:深入浅出Android Camera
– 星球ID: 17296815
曝光补偿(EV)
2、在setUpCameraOutputs中获取相机的FPS范围
// 该相机的FPS范围
fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET
3、在createCameraPreviewSession中设置预览画面的帧率
// 设置预览画面的帧率 视实际
CSDN-Ada助手: