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

控制曝光的相关参数

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

首先,要控制是否自动曝光,也就是 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手动曝光

因为项目的原因,最近在纠结在控制曝光的情况下,帧率调整的问题,中途查了些资料,在这里记录一下自己的理解,有不对还烦请指正~控制曝光的相关参数首先,要控制是否自动曝光,也就是CONTROL_AE_MODE这个参数。如果这个模式是ON的,帧率控制就可以由CONTROL_AE_TARGET_FPS_RANGE来控制,如下列代码所示:Range&lt;Integer&gt; 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助手: 非常感谢您在CSDN平台上发表了这篇博客,我们很抱歉看到您在编译时遇到了问题。不过,我们相信这些挑战会让您变得更加强大。同时,我们也希望您能够分享您的经验和解决方法,帮助更多的开发者。 作为一个技术爱好者,您可以考虑撰写一篇关于编译错误排查和解决的技术博客,分享您解决这个问题的过程和经验。在博客中,您可以分享你的技巧和思路,告诉读者在遇到类似问题时该如何快速定位和解决错误。相信这篇博客会对很多开发者有所帮助。 期待您的下一篇技术博客! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。