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);}}

Android Camera2 实现连拍相关推荐

  1. Android Camera2 使用指北

    目录 Camera2 API使用 Camera2 使用流程简述 上面两幅图是camera硬件层面成像的基本流程,感觉图非常好,所以以此为开端! Camera2 API使用 1. 监听和枚举相机设备. ...

  2. android camera2获取摄像头支持的分辨率

    android camera2 获取摄像头支持的分辨率 41的for循环我注释了,代码是获取最匹配的分辨率. private Size getMatchingSize2(){Size selectSi ...

  3. Android Camera2 拍照(四)——对焦模式

    原文:Android Camera2 拍照(四)--对焦模式 本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换. 一.手动对焦响应事件 首先我们要实现点 ...

  4. android camera捕捉,通过android camera2 API捕捉4:3相机图片与16:9传感器阵列相机

    我想从使用Camera2 API(Android 5.0版本中添加)的Android fron-facing相机以4:3的宽高比捕捉视频.它工作正常,除非相机有16:9传感器阵列(作为三星Galaxy ...

  5. 如何实现RTMP推送Android Camera2数据

    Camera2简介 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用的AP ...

  6. android Camera2 API使用详解

    原文:android Camera2 API使用详解 由于最近需要使用相机拍照等功能,鉴于老旧的相机API问题多多,而且新的设备都是基于安卓5.0以上的,于是本人决定研究一下安卓5.0新引入的Came ...

  7. Android Camera2 教程 · 第三章 · 预览

    Android Camera2 教程 · 第三章 · 预览 DarylGo关注 Android Camera 上一章<Camera2 开启相机>我们学习了如何开启和关闭相机,接下来我们来学 ...

  8. 【Android Camera2】玩转图像数据 -- NV21图像旋转,镜像,转rgba代码分析,性能优化

    [Android Camera2]玩转图像数据 业务场景介绍 NV21数据旋转 逐像素遍历法 NV21数据镜像 逐像素遍历法 中心翻转法 NV21转RGB/RGBA数据 逐像素遍历法 NV21组合操作 ...

  9. Android camera2对焦设置

    在android camera2 api 开始,提供了对焦距值(非zoom值)的设置,大概步骤如下: (1)先关闭自动焦距模式    mPreviewBuilder.set(CaptureReques ...

  10. android camera2 API流程分析

    Android camera2 API流程分析 Android5.0之后,新推出来了一个类,android.hardware.camera2,与原来的camera的类实现照相和拍视频的流程有所不同,原 ...

最新文章

  1. ISLR线性回归笔记
  2. ASP.NET中删除文件夹下的文件
  3. linux内核模块编译
  4. 5.8 程序示例--线性分类-机器学习笔记-斯坦福吴恩达教授
  5. Java调用net的Webservice时提示:undefined element declaration 's:schema'
  6. Java黑皮书课后题第5章:*5.16(找出一个整数的因子)编写程序,读入一个整数,然后以升序显示它的所有最小因子。例如,若输入的整数是120,那么输出就应该是:2、2、2、3、5
  7. Android之获取应用程序(包)的大小-----PackageManager的使用(二)
  8. C++ 高级篇(二)—— 名空间 (Namespaces)
  9. [转]给控件做数字签名
  10. python中的tkinter模块
  11. deep deepfm wide 区别_个性化推荐如何满足用户口味?微信看一看的技术这样做
  12. 刀剑神域服务器维护到什么时候,刀剑神域黑衣剑士王牌维护结束时间 服务器维护进不去怎么办...
  13. java 父类返回子类是咧_【daily】Java泛型 - 返回父类的子类
  14. 打包部署时jar包和war包的区别
  15. Homestead安装 PHP Redis 扩展
  16. python培训学堂怎么样_如何评价开智学堂开设的课程?
  17. Java实现数组排序
  18. Java将汉字数字日期转换为数字日期(例如: 二〇二〇年十一月二十一日 → 2020年11月21日)
  19. 赠书!Python 安全攻防,终于来了!
  20. SEO图片优化基本技巧

热门文章

  1. 计算机组装硬件配置清单,组装电脑配置清单
  2. 戒指你戴对了吗?Meet Surprise教你正确的戴法
  3. MongoDB5.0安装总结(简单)
  4. TCP-IP计算机网络基本概述
  5. Python 实现 2048 游戏
  6. 电脑突然无法复制粘贴的问题
  7. cdr2022更新24.1版CorelDRAW2022稳定版
  8. onclick事件诡异事件 一
  9. 用计算机算账老是出负数是怎么回事,结存数量为负数是什么意思
  10. JAVA设计模式之桥接模式