因为项目的原因,最近在纠结在控制曝光的情况下,帧率调整的问题,中途查了些资料,在这里记录一下自己的理解,有不对还烦请指正~
想要达到的效果大概是,在曝光一定(符合项目需求)的情况下,获取最大帧率。
控制曝光的相关参数
自动曝光下的最大帧率获取
首先,要控制是否自动曝光,也就是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手动曝光