【Android】Camera2的曝光控制与帧率问题

因为项目的原因,最近在纠结在控制曝光的情况下,帧率调整的问题,中途查了些资料,在这里记录一下自己的理解,有不对还烦请指正~
想要达到的效果大概是,在曝光一定(符合项目需求)的情况下,获取最大帧率

控制曝光的相关参数

自动曝光下的最大帧率获取

首先,要控制是否自动曝光,也就是CONTROL_AE_MODE这个参数。如果这个模式是ON的,帧率控制就可以由CONTROL_AE_TARGET_FPS_RANGE来控制,如下列代码所示:

Range<Integer> maxFps;

fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
// Log.d("FPS", "SYNC_MAX_LATENCY_PER_FRAME_CONTROL: " + Arrays.toString(fpsRanges));
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);
//采用自定义的函数获取Size
mPreviewSize = getOptimalSize(map.getOutputSizes(SurfaceTexture.class), width, height); 
//此处的Format是项目中用到的,就沿用了            
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);//所有3A控件被禁用

参数还没调整好,先记录着,调整完毕后再来修改~
而且发现曝光补偿EVCONTROL_AE_EXPOSURE_COMPENSATION其实也影响曝光效果,不过这应该是影响自动曝光算法的。

参考链接

1.Android Developers | Camera2 API
2.第34讲 Android Camera2 API AE手动曝光

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值