Android Camera AE和AF的设置
以geekcamera为例,当关闭闪光灯时,flash mode = 0,代表flash为off模式;
ae mode = 1,代表ae为off模式,flash state = 2,代表flash处于 ready状态,表示没有打闪。
当闪光灯设置为auto时,是通过设置ae mode 控制的。flash mode = 0,代表flash为off模式;
ae mode = 2,代表ae为on模式,flash state = 2,代表flash处于 ready状态,表示没有打闪;flash state = 3,代表flash处于 fired状态,表示打闪了。
具体代码逻辑
switch(flash_value) {case "flash_off":builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_auto":// note we set this even in fake flash mode (where we manually turn torch on and off to simulate flash) so we// can read the FLASH_REQUIRED state to determine if flash is required/*if( use_fake_precapture || CameraController2.this.want_expo_bracketing )builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);else*/builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);//这里FLASH_MODE可以设置为任意值,因为AE_MODE优先级高builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_on":// see note above for "flash_auto" for why we set this even fake flash mode - arguably we don't need to know// about FLASH_REQUIRED in flash_on mode, but we set it for consistency.../*if( use_fake_precapture || CameraController2.this.want_expo_bracketing )builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);else*/builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_torch":builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);break;case "flash_red_eye":// not supported for expo bracketing or burstif( CameraController2.this.burst_type != BurstType.BURSTTYPE_NONE )builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);elsebuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_frontscreen_auto":case "flash_frontscreen_on":case "flash_frontscreen_torch":builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;
}
只要flash mode不是auto,并且需要打闪的时候,就需要做预闪(precapture)
boolean needs_flash = capture_result_ae != null && capture_result_ae != CaptureResult.CONTROL_AE_STATE_CONVERGED;
if( camera_settings.flash_value.equals("flash_auto") && !needs_flash ) {// if we call precapture anyway, flash wouldn't fire - but we tend to have a pause// so skipping the precapture if flash isn't going to fire makes this fasterif( MyDebug.LOG )Log.i(TAG, "flash auto, but we don't need flash");call_takePictureAfterPrecapture = true;
}
else {call_runPrecapture = true;
}if( call_runPrecapture ) {runPrecapture();
}
runPrecapture逻辑
runPrecapture() {final CaptureRequest.Builder precaptureBuilder = mCameraDevice.createCaptureRequest(previewIsVideoMode ? CameraDevice.TEMPLATE_VIDEO_SNAPSHOT : CameraDevice.TEMPLATE_STILL_CAPTURE);precaptureBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);camera_settings.setupBuilder(precaptureBuilder, false);precaptureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE);precaptureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);precaptureBuilder.addTarget(getPreviewSurface());state = STATE_WAITING_PRECAPTURE_START;precapture_state_change_time_ms = System.currentTimeMillis();// first set precapture to idle - this is needed, otherwise we hang in state STATE_WAITING_PRECAPTURE_START, because precapture already occurred whilst autofocusing, and it doesn't occur again unless we first set the precapture trigger to idleif( MyDebug.LOG )Log.i(TAG, "capture with precaptureBuilder");captureSession.capture(precaptureBuilder.build(), previewCaptureCallback, handler);captureSession.setRepeatingRequest(precaptureBuilder.build(), previewCaptureCallback, handler);// now set precaptureprecaptureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);captureSession.capture(precaptureBuilder.build(), previewCaptureCallback, handler);
}
这里将state 设置为了STATE_WAITING_PRECAPTURE_START,当captureSession.capture()调用完后,会执行到CameraCaptureSession的回调函数onCaptureCompleted(),在此回调函数中我们需要判断AE的状态是否等于CaptureResult.CONTROL_AE_STATE_PRECAPTURE,如果等于,那么执行takePictureAfterPrecapture()
takePictureAfterPrecapture()的逻辑
takePictureAfterPrecapture(){stillBuilder = mCameraDevice.createCaptureRequest(previewIsVideoMode ? CameraDevice.TEMPLATE_VIDEO_SNAPSHOT : CameraDevice.TEMPLATE_STILL_CAPTURE);stillBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);stillBuilder.setTag(new RequestTagObject(RequestTagType.CAPTURE));camera_settings.setupBuilder(stillBuilder, true);stillBuilder.addTarget(imageReader.getSurface());captureSession.capture(stillBuilder.build(), previewCaptureCallback, handler);playSound(MediaActionSound.SHUTTER_CLICK);
}
Android Camera AE和AF的设置相关推荐
- Android Camera设置setPreviewCallback实现onPreviewFrame接口实时截取每一帧视频流数据
1 概述 通过Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口,实时截取每一帧视频流数据 2 知识点 ① Android Camera ...
- 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )
文章目录 安卓直播推流专栏博客总结 一. Camera 传感器方向简介 二. Camera 图像传感器横向显示数据 三. Camera 图像传感器纵向显示数据 四. 设置 Camera 预览数据方向 ...
- 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )
文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...
- Android Camera开发系列:设置对焦模式模式
你对android camera的对焦模式熟悉吗? 知道什么场景下该设置哪种对焦模式吗? 本文针对下面2点展开介绍,和大家一起学习~ 一.有哪几种对焦模式? 二.如何使用各种对焦模式? 一.有哪几种对 ...
- android camera(6)---camera2 拍照流程
android camera2 拍照流程 正文 camera2 API 的加入是从AndroidV5.0(21)开始的,因此我们使用Camera2应该是在Android 5.0(含5.0)之后.同时, ...
- Android camera闪光灯
两种工作模式: Camera flash led分flash和torch两种模式. Flash: 拍照时闪光灯瞬间亮一下的情况,电流比较大,目前是1000mA,最大电流不能超过led的最大承受能力. ...
- Android Camera 开发常见专业术语名词解释
Android Camera 开发常见专业术语名词解释 参考网址:http://m.blog.csdn.net/king1425/article/details/62224468 相机常见专业术语名词 ...
- Android Camera了解一下
首发于公众号 Android Camera了解一下 Camera 演进简介 最近在项目中遇到 Camera相关的场景,之前对这块不是很了解,趁机补了一下盲区.Android Camera 相关也是生态 ...
- Camera HAL3学习: Android Camera System
Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层camera drive与硬件和位于android.hardware中的framew ...
最新文章
- MonoRec:无需激光雷达,只需单个相机就可以实现三维场景的稠密重建
- dedecms织梦移站后替换数据库中文件路径命令
- 中判断字符串是否为空_leetcode1704_go_判断字符串的两半是否相似
- OpenWrt安装迅雷成功,实现BT emule等多协议下载
- P4768 [NOI2018] 归程(kruskal 重构树)
- UVALive 4394 String painter
- 满满干货!mysql无法修改表的数据
- C++中使用模板,new创建2维动态数组
- 自适应输出表格(ASP版)
- EFM32片内外设--TFT 汉字字库
- 最小二乘法 c 语言程序,最小二乘法的嵌入式C语言实现
- Eclipse 2020如何创建JAVA Web项目
- 中科大计算机考研录取分数线_计算机专业学校考研难度排行榜 计算机考研难度排名...
- 【linux】运行run文件显示cannot execute binary file
- windows 下如何让一个窗口置顶?
- python游戏代码怎样才能玩好英雄联盟_怎样才能玩好英雄联盟-百度经验
- Android 音频源码分析——AndroidRecord录音(一)
- 思考:你的工作是否有反脆弱性?
- CH340C的ESP8266一键下载电路设计
- 播放视频 unity使用rawimage控制视频,包括暂停,继续,跳过等;调整视频尺寸,解决视频无声音的情况