Android Camera2 实现连拍

gitee 链接:
通过 captureBurst 实现连拍
拍完的图片放在 /data/data/com.example.burstcapture/files/
图片路径
连拍的具体实现代码在 BurstCapture.java 、BurstCaptureExpo.java、BurstCaptureFocus.java中,调用在 MainActivity.java中,调用方式很简单
连拍调用方式

普通连拍直接创建 BurstCapture 这个类,在这个类的构造方法中会发 request

注意 :下面代码中的照片保存的路径 /data/data/com.example.burstcapture/files/ 中的 files 文件夹是我自己创建的,你需要自己手动创建下。

下面代码即可实现连拍:

mImageReader.setOnImageAvailableListener(mReaderImgListener, null);
mStillBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
mStillBuilder.addTarget(mImageSurface);
CaptureRequest request = mStillBuilder.build();
List<CaptureRequest> requests = new ArrayList<>();
// 改变下面的i的取值范围就可以改变连拍的数量
for(int i=0;i<3;i++)requests.add(request);
mCaptureSession.captureBurst(requests, null, null);
ImageReader.OnImageAvailableListener mReaderImgListener = new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {writeImageToFile();}
};
private void writeImageToFile() {String filePath = "/data/data/com.example.burstcapture/files/"+imageIndex+".jpg";imageIndex++;Image image = mImageReader.acquireNextImage();if (image == null) {return;}ByteBuffer byteBuffer = image.getPlanes()[0].getBuffer();byte[] data = new byte[byteBuffer.remaining()];byteBuffer.get(data);FileOutputStream fos = null;try {fos = new FileOutputStream(new File(filePath));fos.write(data);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {fos.close();fos = null;} catch (IOException e) {e.printStackTrace();} finally {image.close();image = null;}}
}

不同曝光时间的连拍:

mStillBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
mStillBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
// 把AE关掉,通过手动的方式控制AE
mStillBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
private void takePicturePrecapture(){final CaptureRequest.Builder precaptureBuilder;try {precaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);precaptureBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);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(mPreViewSurface);int sequenceId = mCaptureSession.capture(precaptureBuilder.build(), null, null);sequenceId = mCaptureSession.setRepeatingRequest(precaptureBuilder.build(), null, null);precaptureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);sequenceId = mCaptureSession.capture(precaptureBuilder.build(), mMCaptureCallback, null);} catch (CameraAccessException e) {e.printStackTrace();}
}
MCaptureCallback mMCaptureCallback = new MCaptureCallback();private class  MCaptureCallback extends CameraCaptureSession.CaptureCallback {@Overridepublic void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {Log.e("TAG", "============================== onCaptureCompleted: ");Integer ae_state = result.get(CaptureResult.CONTROL_AE_STATE);if (ae_state == CaptureResult.CONTROL_AE_STATE_PRECAPTURE){try {mStillBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);mStillBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);// 把AE关掉,通过手动的方式控制AEmStillBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);mStillBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH); // just in casemStillBuilder.addTarget(mImageSurface);CaptureRequest captureRequest = mStillBuilder.build();List<CaptureRequest> requests = new ArrayList<>();Range<Integer> iso_range = mCharacteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE); // may be null on some devicesint iso = 800;// see https://sourceforge.net/p/opencamera/tickets/321/ - some devices may have auto ISO that's// outside of the allowed manual iso range!iso = Math.max(iso, iso_range.getLower());iso = Math.min(iso, iso_range.getUpper());mStillBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, iso );mStillBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, 1000000000L/30);int n_half_images = 3/2;long base_exposure_time = 22222000;long min_exposure_time = base_exposure_time;long max_exposure_time = base_exposure_time;float expo_bracketing_stops = 2.0f;final double scale = Math.pow(2.0, expo_bracketing_stops/(double)n_half_images);Range<Long> exposure_time_range = mCharacteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE); // may be null on some devicesif( exposure_time_range != null ) {min_exposure_time = exposure_time_range.getLower();max_exposure_time = exposure_time_range.getUpper();}// darker imagesfor(int i=0;i<1;i++) {long exposure_time = base_exposure_time;if( exposure_time_range != null ) {double this_scale = scale;for(int j=i;j<n_half_images-1;j++)this_scale *= scale;exposure_time /= this_scale;if( exposure_time < min_exposure_time )exposure_time = min_exposure_time;mStillBuilder.setTag(new String("darker images"));mStillBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposure_time);Log.e("TAG", " 0000000000 ");requests.add( mStillBuilder.build() );}}Log.e("666666", "scale = "+scale +" base_exposure_time = "+base_exposure_time+" exposure_time = "+base_exposure_time/scale);mStillBuilder.setTag(new String("base image"));// base imagemStillBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, base_exposure_time);requests.add( mStillBuilder.build() );// lighter imagesfor(int i=0;i<n_half_images;i++) {long exposure_time = base_exposure_time;if( exposure_time_range != null ) {double this_scale = scale;for(int j=0;j<i;j++)this_scale *= scale;exposure_time *= this_scale;if( exposure_time > max_exposure_time )exposure_time = max_exposure_time;mStillBuilder.setTag(new String("lighter images"));mStillBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposure_time);Log.e("TAG", " 1111111111111 ");requests.add( mStillBuilder.build() );}}Log.e("TAG", "n_half_images = "+n_half_images );Log.e("666666", "scale = "+scale +" exposure_time = "+(scale * base_exposure_time)+" base_exposure_time = "+base_exposure_time);//            mCaptureSession.stopRepeating();mCaptureSession.captureBurst(requests, null, null);} catch (CameraAccessException e) {e.printStackTrace();}}super.onCaptureCompleted(session, request, result);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/49398.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对拍详解

对拍详解 ——HM 对拍是家中写题、考场中写题判断自己的程序答案是否正确的一种技巧&#xff0c;当…

Android Camera预览角度和拍照保存图片角度学习

1 Camera预览角度处理 开发Camera过程中会遇到Camera拍照&#xff0c;获取照片后可以上传照片或者展示给用户。 Camera的图像数据来源于摄像头硬件的图像传感器&#xff0c;这个图像传感器被固定到手机上后会有一个默认的方向&#xff0c;一般默认方向是当手机左侧横放时&…

国仁网络资讯:短视频拍摄如何上热门;掌握这8大拍摄运镜手法即可。

抖音视频拍摄基本分为两种:一种是随手拍,记录生活精彩时刻;一种是情景拍摄,一般整个视频都是设计好的。 随手一拍很轻松,但未免没有那么多偶然的精彩瞬间,此时就需要我们自己去编排了,编排出一条精彩视频,拍摄技巧是必须的。 不同拍摄手法所表达的意思也各不相同。那么…

定位教程4-固定相机之先抓后拍

相机固定,机器人吸住一个物料,拍照,然后将电池放到其他位置,这也是一个经典的应用场景。 相机在上和在下都是一样的标定方法,只是需要注意下角度取反而已,大家在实际使用的时候自己测试一下就知道角度取反问题. 其标定方法和之前的固定相机-先拍再抓一样,都是先9点标定,再5点标…

Android 使用CameraX实现预览/拍照/录制视频/图片分析/对焦/缩放/切换摄像头等操作

1. CameraX架构 看官方文档 CameraX架构 有如下这一段话 使用CameraX&#xff0c;借助名为"用例"的抽象概念与设备的相机进行交互。 预览 : 接受用于显示预览的Surface&#xff0c;例如PreviewView图片分析 : 为分析 (例如机器学习) 提供CPU可访问的缓冲区图片拍摄…

Android 使用Camera2 实现拍照录像的功能

职场小白迷上优美句子: 还是电影 《无问西东》中的台词&#xff0c;这句有点感人&#xff1a; 沈光耀的妈妈对沈光耀说&#xff1a;"当初你离家千里&#xff0c;来到这个地方读书&#xff0c;你父亲和我都没有反对过&#xff0c;因为&#xff0c;是我们想你&#xff0c;…

天猫精灵Aligenie对接记录(三)

原文 https://www.jksxit.com/essay/42 服务端需要开发API接口处理阿里精灵发送的智能设备控制指令&#xff0c;并遵循AliGenie智能家居接入协议。 &#xff08;1&#xff09;同步模式

天猫精灵智能设备对接(4)

apache2php7.0 web服务器的构建 我个人使用的服务器是腾讯云&#xff0c;系统是ubuntu16.04&#xff0c;如果大家要是没有云服务器可以采用花生壳内网穿透的方法&#xff0c;还能得到一个只能在花生壳免费部署的域名&#xff0c;但是也要花6块钱&#xff0c;看需求了&#xff0…

天猫精灵智能家居对接,及天猫iot官网配置图文讲解(二)

天猫精灵智能家居对接,及天猫iot官网配置图文讲解&#xff08;二&#xff09; 2、天猫精灵设备对接 2-1、介绍 ​ 上一章里&#xff0c;我已经讲了天猫精灵的技能配置&#xff0c;设备创建&#xff0c;登录验证这三个部分做了&#xff0c;此次篇文章就讲之后的设备查询&…

天猫精灵智能设备对接(5) SSL https设置

至于什么是SSL证书具体有什么用&#xff0c;想了解的自行百度吧&#xff0c;再不行谷歌&#xff0c;百度出来的东西比我这个外行巴拉巴拉说半天来的痛快&#xff0c;本来腾讯云是送免费一年的SSL证书的&#xff0c;但是我赶得非常不巧&#xff0c;在我做测试那几天腾讯的ssl服务…

天猫精灵智能设备对接(8) 开发者网关地址

洋洋洒洒六七千字已经搭进去了&#xff0c;终于把服务器篇写的差不多了&#xff0c;当然小狂不是专业的写手&#xff0c;有些东西写的凑合看吧&#xff0c;只是说明过程&#xff0c;并不修饰言辞&#xff0c;看的舒服就点个赞&#xff0c;不舒服就当学东西了吧。这篇文章我们将…

springboot项目接入天猫精灵

springboot项目接入天猫精灵 最近工作需要使用到天猫精灵的语音功能&#xff0c;大体是通过呼叫对应的“调用词”实现携带参数&#xff0c;然后调用我项目中的接口&#xff0c;以实现对应的业务。所以在此简单的记录下使用过程 实际上&#xff1a;天猫精灵的官方文档记录的也很…

天猫精灵智能家居对接,及天猫iot官网配置图文讲解(一)

天猫智能家居对接 1-1、介绍 这篇文章主要是介绍&#xff0c;如何使用java对接天猫精灵智能家居提供的api。这么做的好处就是能让用户通过天猫精灵发送命令到我们的服务器&#xff0c;然后操控设备执行一系列的命令&#xff0c;当然这些功能呢都是天猫精灵官方制定的协议&…

java对接天猫精灵语音助手实现对公司其下的智能设备进行控制(附上源码)

java对接天猫精灵语音助手实现对公司其下的智能设备进行控制 前言当初刚来广州 公司上一任java已经离职半年 &#xff0c;项目已经跑不动了&#xff0c;才招人的&#xff0c;所以我获得的是一个连跑都跑不起来的项目源码并且对项目一无所知&#xff0c;一年前网上并没有对接天…

天猫精灵智能设备对接(7) OAuth2.0

在开始之前先放两篇参考&#xff0c;一篇英文http://bshaffer.github.io/oauth2-server-php-docs/cookbook/&#xff0c;一篇中文https://www.cnblogs.com/endv/p/7868549.html&#xff0c;中文博客里的内容基本上是把英文官方文档翻译一遍。到这里如果你不知道OAuth2.0是啥可以…

天猫精灵对接2(OAuth 搭建)

根据 接入方式及流程 中的说明&#xff0c;可知&#xff0c;搭建过程中&#xff0c;我们需要自己整一个 OAuth 的授权平台&#xff0c;具体说明可以参考蟋蟀大哥的文章 ASP.NET WebApi OWIN 实现 OAuth 2.0 &#xff0c;我的实际代码也是基于文章给出的源码修改的。 第一步 认…

天猫精灵对接智能设备

why to do&#xff1a;   我之前一直很喜欢智能家居&#xff0c;可惜的是现在市场上成品的智能家居实在是太贵了&#xff0c;屌丝的码农是在背不起每月高额的房贷和装修费用的基础上&#xff0c;再买成品的智能设备&#xff08;像某米那样一个智能开关&#xff0c;竟然卖那么…

从零玩转系列之SpringBoot3-核心原理

一、简介 1.前置知识 ● Java17 ● Spring、SpringMVC、MyBatis ● Maven、IDEA 2.环境要求 环境&工具版本(or later)SpringBoot3.1.xIDEA2023.xJava17Maven3.5Tomcat10.0Servlet5.0GraalVM Community22.3Native Build Tools0.9.19 二、SpringBoot3-核心原理 1.事件和监听器…

SpringBoot3【⑤ 核心原理】

1. 事件和监听器 1. 生命周期监听 场景&#xff1a;监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件&#xff1b; 1.1. 编写SpringApplicationRunListener 这个接口的实现类 1.2. 在 META-INF/spring.factories …

开发必备,开源 or 免费的 AI 编程助手

AI 大模型的火热&#xff0c;让开发圈近来如虎添翼&#xff0c;各种各样基于 AI 技术的开发者工具和新范式不断涌现&#xff0c;尤其是 Github 和 OpenAI 共同推出的 Copilot X &#xff0c;更是一骑绝尘。本文推荐一些开源 or 免费的 AI 编程工具&#xff0c;不妨试着用起来。…