Camera2打开相机,建立会话,并监听相机流(以拍照为例)

2023-05-16

Camera2打开相机,建立会话,并监听相机流(以拍照为例)

  • 获取 CameraManager
  • 通过 CameraManager.openCamera() 方法打开相机,监听回调,获取 CameraDevice
  • 通过 CameraDevice.createCaptureSession() 方法,建立会话,监听回调,获取 CameraCaptureSession
  • 创建 CaptureRequest
  • CameraCaptureSession 通过 setRepeatingRequest 或 capture 方法,进行会话,通过捕获相机流,对相机流进行处理
  • 细节

  • 获取 CameraManager

    (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    
  • 通过 CameraManager.openCamera() 方法打开相机,监听回调,获取 CameraDevice

    /**
         * 参数
         * cameraId 前置或后置摄像头ID,前置 1 后置 0
         * callback
         * handler 表示 openCamera 代码运行所在的线程,传null,表示运行在当前线程
         */
    mCameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
            @Override
            public void onOpened(@NonNull CameraDevice camera) {
                mCameraDevice = camera;
            }
    
            @Override
            public void onDisconnected(@NonNull CameraDevice camera) {
    
            }
    
            @Override
            public void onError(@NonNull CameraDevice camera, int error) {
    
            }
        }, null);
    
  • 通过 CameraDevice.createCaptureSession() 方法,建立会话,监听回调,获取 CameraCaptureSession

    	// width 和 height 与 surfaceview 的相同
    	//ImageReader 用于接收处理(拍照、录像)的相机流
    	//SurfaceView 用于接收预览的相机流
         ImageReader mImageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
         List<Surface> surfaces = new ArrayList<>();
         surfaces.add(surfaceView.getHolder().getSurface());
         surfaces.add(mImageReader.getSurface());
         /**
         * 参数
         * outputs 相机流输出的地方
         * callback
         * handler 表示 createCaptureSession 代码运行所在的线程,传null,表示运行在当前线程
         */
    mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                mCameraCaptureSession = session;
            }
    
            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession session) {
    
            }
        }, null);
    
  • 创建 CaptureRequest

    	//        创建用于预览的CaptureRequest
        CaptureRequest.Builder captureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        //相机流输出的位置
        captureRequest.addTarget(surfaceViewSurface);
        CaptureRequest build = captureRequest.build();
    
    //        创建用于处理照片的CaptureRequest
        CaptureRequest.Builder captureRequest = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
        //相机流输出的位置
        captureRequest.addTarget(mImageReader.getSurface());
        CaptureRequest build = captureRequest.build();
    
  • CameraCaptureSession 通过 setRepeatingRequest 或 capture 方法,进行会话,通过捕获相机流,对相机流进行处理

    //连续通信,用于预览
    mCameraCaptureSession.setRepeatingRequest(captureRequest.build(), null, null);
    
    //一次通讯,用于拍照
    //先将 mImageReader 中的内容清空
    while (mImageReader.acquireNextImage() != null){
    
        }
     // mImageReader 捕获相机流中的信息
    mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                Image image = reader.acquireNextImage();
    
    			// 转成 Bitmap
                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                byte[] b = new byte[buffer.capacity()];
                buffer.get(b, 0 , b.length);
                Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
                // 释放 Image,否则,不能进行下次捕获,因为定义时,设置的只能捕获一张图片
                image.close();
            }
        }, null);
        CaptureRequest.Builder captureRequest = mCameraCaptureSession.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
        captureRequest.addTarget(mImageReader.getSurface());
        //进行通信
        mCameraCaptureSession.capture(captureRequest.build(), null, null);
    
  • 细节

    • SurfaceView 使用时,必须已经在界面中显示,否则,获取 surface 时,会异常
    • ImageReader 捕获照片时,Image 处理完后,必须执行 image.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Camera2打开相机,建立会话,并监听相机流(以拍照为例) 的相关文章

  • 对三层和MVC的认识过程

    三层架构就是 MVC xff01 起初老师总说三层 MVC xff0c MVC 三层架构 所以开始的时候脑子就一个概念 xff1a 三层就是 MVC xff0c MVC 就是三层架构 而且想想也合理啊 xff0c 都是 三 MVC 是三个字
  • Spring入门详解(一)如何配置一个简单的spring项目

    关于spring的一些概念 xff0c 网上已经有很多的说明 xff0c 本系列不会做太多的描述 xff0c 重心在如何配置上 一 准备工作 1 安装JDK xff0c 配置环境 本来不想写这条的 想了想 xff0c 还是写上 2 下载开发
  • 超简洁的群晖交叉编译教程

    超简洁的群晖交叉编译教程 最近把一个群晖的NAS放在校园网里的时候遇到了锐捷认证的问题 xff0c 找了一下没有现成的程序可以拿来用 xff0c 然后自己交叉编译一个mentohust来用 1 环境 Ubuntu20 04 xff0c 先去
  • 基于docker部署nextcloud及其升级和问题修复

    之前用docker部署了一个版本的nextcloud xff0c 但是当时版本中存在一些bug xff0c 所以想升级一下 油管上有博主直接在nextcloud设置里更新的而且能用 这是地址 xff0c 懂的都懂 xff0c 但是我在nex
  • TFRecord的一些用法

    1 TFRecord的用法 首先 xff0c TFRecord是把你的数据存成文件的一个东西 所以首先要有个写文件的东西 xff0c 就是 writer span class token operator 61 span tf span c
  • rsync --exclude或者--exclude-from的路径问题

    先开个头 xff0c 注意 的使用 假设有 my src dir a 把 my src dir复制到 my dst dir xff0c 结果 my dst dir my src dir a rsync a my src dir my dst
  • Sentry迁移:从一台机器到另一台机器

    搜了一下 xff0c 目前写部署的帖子很多 xff0c 但是没找到比较完善的迁移的帖子 xff0c 记一下自己的方法吧 思路 因为现在基本都是使用docker部署 xff0c 所以常规思路大概是docker容器的迁移 xff0c 但是现在s
  • Android studio 2.3.3+Dlib

    最近因为需要 xff0c 尝试着将Dlib移植到android上 android小白一枚 xff0c 做之前没接触过android xff0c 所以就用了别人说比较好的android studio 最新稳定版 xff08 windows下
  • 用verilog实现L293D 驱动板接口

    课程实验做了一个蓝牙智能小车 xff0c nexys4开发板 xff0c MIPSfpga xff08 一个在 FPGA 上实现的商业 MIPS 处理器软核 xff0c Imagination Technologies公司提供给高校免费使用
  • 斐讯k2p openwrt固件改双WAN口

    原理参考教你玩转K2P A1 A2 官改版VLAN 步骤 xff1a network配置 xff0c etc config network里把wan的ifname由原来的eth1改成eth1 2增加wan2 xff0c eth1 3dhcp
  • windows 10安装Anaconda后pip报SSL错解决

    问题 新装的系统 xff0c 安装anaconda python 61 3 7 后 pip install xxx pip is configured with locations that require TLS SSL however
  • JSP中文乱码问题终极解决方案

    在介绍方法之前我们首先应该清楚具体的问题有哪些 xff0c 笔者在本博客当中论述的 JSP 中文乱码问题有如下几个方面 xff1a 页面乱码 参数乱码 表单乱码 源文件乱码 下面来逐一解决其中的乱码问题 一 JSP 页面中文乱码 在 JSP
  • ubuntu lightdm test用户自动登陆

    1 编辑 etc lightdm lightdm conf d 50 myconfig conf 内容 SeatDefaults autologin user 61 test 注意此处是自己要登陆的用户名字
  • 猴小萌的博客开通啦

    多年痴迷计算机技术 xff0c 孜孜不倦地学习着计算机的一切 xff0c 享受着计算机带给我的乐趣和满足感 然而有一天 xff0c 突然发现我所获得的知识和问题的答案基本上全部都来自于网络 xff0c 却从来没有为社区奉献过 xff0c 上
  • Cesium入门(一):第一张Cesium页面

    本章主要讲述如何下载和使用Cesium xff0c 编写完成自己的第一张Cesium应用页面 主要从以下几个方面展开叙述 xff1a 下载和部署CesiumJS编写第一张Cesium页面 1 下载和部署CesiumJS CesiumJS是一
  • Cesium入门(二):Viewer控件参数与外观定制

    本章主要介绍Cesium Viewer控件的选项参数 xff0c 以及如何对Viewer的外观进行定制 主要包括以下内容 xff1a Viewer控件Viewer选项参数定制Viewer外观界面 1 Viewer控件 Viewer是构建Ce
  • Cesium入门(三):加载WMS地图服务

    本章介绍Cesium Viewer控件的是如何加载地图的 xff0c 并以GeoServer服务器为例演示了WMS服务的加载过程 主要包括以下内容 xff1a ImageryProvider加载GeoServer发布的WMS服务 在Cesi
  • Cesium入门(四):叠加显示多个图层

    本章介绍Cesium Viewer控件的imageryLayers容器 xff0c 了解添加和叠加显示多个图层的方法 主要包括以下内容 xff1a imageLayers图层容器添加多个图层 1 imageryLayers图层容器 imag
  • GeoServer入门(一):发布第一个WMS图层

    本章主要讲述如何下载和安装使用GeoServer服务器 xff0c 介绍了GeoServer的管理界面 xff0c 并演示了发布地理数据的简单流程 主要从以下几个方面展开叙述 xff1a 下载和安装GeoServerGeoServer管理界
  • FreeBSD内存交换文件的设置与自动加载

    本文主要讲述FreeBSD操作系统下内存交换文件的作用及其自动加载过程 xff0c 主要从以下几个方面展开叙述 xff1a 交换文件的设置交换文件的自动加载 交换文件是虚拟内存机制的重要组成部分 xff0c 在物理内存不够用时可以临时将不常

随机推荐

  • GeoServer入门(二):WMTS图层瓦片切割与调用

    本章主要讲述如何GeoServer进行图层瓦片切割与缓冲 xff0c 发布标准的WMTS服务 xff0c 并介绍了REST格式的调用参数 主要包含以下内容 xff1a 图层切片与缓冲WMTS服务调用 在GeoServer入门 xff08 一
  • Cesium入门(五):加载WMTS瓦片地图服务

    本章介绍Cesium JS库的WebMapTileServiceImageryProvider类 xff0c 并以GeoServer为例演示了在CesiumViewer控件中添加瓦片图层的方法 主要包括以下内容 xff1a WebMapTi
  • 深入学习Tomcat----自己动手写服务器(附服务器源码)

    相信大多 Web 开发者对 Tomcat 是非常熟悉的 xff0c 众所周知 Tomcat 是一款非常好用的开源 Servlet 容器 xff0c 您一定对这个最流行的 Servlet 容器充满好奇 xff0c 虽然它并不像一个黑盒子那样让
  • Cesium入门(六):加载EPSG4326网格的瓦片地图

    本章介绍Cesium JS库的TilingScheme类 xff0c 并以GeoServer服务器为例演示了加载EPSG 4326网络的瓦片地图 主要包括以下内容 xff1a TilingScheme添加EPSG 4326瓦片图层 在Ces
  • Cesium入门(七):设置影像图层的覆盖范围

    本章介绍Cesium JS库的Rectangle类 xff0c 并以GeoServer服务器为例演示了在加载EPSG 4326网格的瓦片地图时 xff0c 通过设置rectangle参数来限定图层的覆盖范围 主要包括以下内容 xff1a R
  • Wget下载网页与镜像网站

    本文主要介绍GNU Wget实用程序及其在在FreeBSD操作系统下的安装过程 xff0c 并对几个最常用的下载功能进行了说明 xff0c 主要包括以下几个方面 xff1a GNU Wget概述Wget程序安装Wget常用功能 1 GNU
  • 使用cron定时执行任务

    本文主要介绍Unix系统中用于定时执行任务的cron守护程序和crontab配置表的文件格式 xff0c 并对自动执行脚本文件时的注意事项进行了说明 xff0c 主要包括以下几个方面 xff1a cron守护程序概述crontab配置表cr
  • 用Imagex备份&还原Windows7简明教程+本人编写的批处理+解说Imagex常用命令

    用Imagex备份 amp 还原Windows7简明教程 43 本人编写的批处理 43 解说Imagex常用命令 2012 03 26 23 32 53 分类 xff1a Windows 7 探索实 标签 xff1a 举报 字号 大 中 小
  • Android 硬件版本问题(M/Q/O/RM)

    M gt MTK Q gt 高通 O gt 海外 RM gt 国内 个人理解 xff1a 软件在编写的过程中 xff0c 为了适配不同的硬件 处理器 xff0c 要搞不同的内置版本
  • 学成在线笔记三:CMS管理页面开发

    注意 xff1a 我是用的element ui的版本位 xff1a 2 10 1 xff0c 若要使用本博客中的前端代码 xff0c 建议修改为相同版本 修改方式 xff1a 修改根目录下的package json中dependencies
  • vue3 和 vite3脚手架相关20个库

    学会这 20 个库 xff0c 让你快速看懂 vue3 和 vite3 源码 x1f680 前言 写一个开源的项目也不例外 xff0c 就拿在国内很火的 vue3 框架 和 vite 工具 来讲 xff0c 其中的实现与架构设计无不是一个
  • SQL高级优化

    知识回顾 1 git版本控制工具 xff0c 主要管理项目的代码文件 它相比CVS SVN它特点 xff0c 可支持分布式 外网 离线工作 主流代码管理工具 2 xff09 基本概念 工作空间 本地索引 本地仓库 远程仓库 就体积而言 xf
  • windows批处理:暂停的处理

    参考 xff1a https www cnblogs com yulinlewis p 10074565 html 总结 xff1a 1 ping n 1 127 1 127 1是127 0 0 1 xff0c 被称为本地回环地址 xff0
  • 如何减小与“大牛”的差距

    为什么同样的时间有的人可以漂亮的完成工作 xff0c 而有些人废了很大的力气也没有完成 xff1f 前者我们常常称之为 大牛 xff0c 后者我们常常叫他们 菜鸟 当然 大牛 都是相对而言的 xff0c 大牛 也不可能方方面面都非常厉害 x
  • Android Studio:模拟器启动后不停闪烁

    解决方法 xff1a graphics选择Software
  • java基于springboot+vue的企业员工人事工资薪酬管理系统 elementui

    系统主要分为管理员和普通用户和员工三部分 主要功能包括个人中心 普通用户管理 员工管理 人事档案管理 部门管理 薪酬管理 人事调动管理 职务管理 培训管理 招聘信息管理 求职简历管理 邀请面试管理 录用信息管理 员工应聘管理 系统管理等功能
  • Unity设置横竖屏

    Unity设置横竖屏 使用开发工具设置 xff08 工程统一设置 xff09 使用代码设置 xff08 可以分开设置不同场景 xff09 使用开发工具设置 xff08 工程统一设置 xff09 使用代码设置 xff08 可以分开设置不同场景
  • 网络错误 Unable to resolve host

    1 没有网络权限 2 没有网络 3 防火墙阻止
  • Android 项目中 Mopub 广告基础使用(插屏和横幅)

    1 下载 MoPub Android SDK repositories mavenCentral MoPub SDK is now available in Maven Central android compileOptions sour
  • Camera2打开相机,建立会话,并监听相机流(以拍照为例)

    Camera2打开相机 xff0c 建立会话 xff0c 并监听相机流 xff08 以拍照为例 xff09 获取 CameraManager通过 CameraManager openCamera 方法打开相机 xff0c 监听回调 xff0