Android Camera

1. 相关的API

Android有三套关于摄像头的API(库),分别是Camera、Camera2和CameraX,其中Camera已废弃,在Android5.0以后推荐使用Camera2和CameraX,Camera2推出是用来替换Camera的,它拥有丰富的API可以为复杂的用例提供深入的控制功能,同样的它使用起来也相对麻烦。而CameraX是在Camera2基础上构建的更高层次的库,旨在简化相机操作,提供更方便的API,降低学习曲线。

2. 选择使用场景

如果对相机的底层控制要求很高,需要自定义功能、处理原始图像数据等,那么 Camera2是一个更合适的选择;如果想要更轻松地实现基本的相机功能,降低开发难度,CameraX 是一个更适合的选择。

3. CameraX简介

CameraX着重于用例,它能支持下面常见用例:

  • 预览。使用PreviewView,它是一种支持裁剪、缩放和旋转的view,相机处于活动状态时,图片预览会流式传输到它的surface。
  • 图片拍摄。提供自动白平衡、曝光、延迟、闪光灯和对焦等功能,支持把图片放到内存缓存区和写文件。
  • 图像分析。应用会对每个帧运行analyze()方法,可以进行图像处理、视觉或机器学习。可以通过设置阻塞和非阻塞的模式处理分析流水线无法满足CameraX帧率要求。
  • 视频拍摄。录制视频流和音频流,对其压缩合并后写入磁盘。

CameraX不是本文重点此处不做详细介绍。

4. Camera2

4.1 设计架构

摄像头可以看做是数据源,可以向摄像头注册多个业务流,摄像头会把每帧的数据同时输出到每个流水线,这些流水线可以并行对数据进行处理,每个流水线可以有自己的输出格式,传入的原始数据会通过每个与流水线相关联的隐士逻辑转换成相应的输出格式。摄像头需要使用CameraCaptureSession接受每个原始帧的帧配置,CameraCaptureSession用来记录绑定到摄像头的所有流水线,创建会话后无法添加或移除流水线。它会维持一个CaptureRequest队列,这些队列会成为活跃配置。CaptureRequest会讲配置添加到队列,选择一个或者多个可用的流水线从摄像头接收帧。

4.2 预览

下面我们写一段代码实现摄像头预览功能


// 创建接受相机帧的数据流(输出缓冲区),每一个数据流就是一个Surface对象,我们要实现预览功能,
// 就用UI中的SurfaceView中的Surface作为数据流,这样相机帧数据直接传输到UI显示,
// 前面提到过可以同时支持多个数据流并行,所以这里使用了list存储,我们只预览,放一个Surface就行了val targets = listOf(fragmentCameraBinding.viewFinder.holder.surface)// 创建CameraCaptureSession, 这是自己封装的函数,具体实现是调用的CameraDevice的函数
val session = createCaptureSession(camera, targets, cameraHandler)// 创建CaptureRequest,里面设置了接受帧的数据流
val captureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply { addTarget(fragmentCameraBinding.viewFinder.holder.surface) }//因为预览需要看到连续的图像,所以需要这个请求重复调用
session.setRepeatingRequest(captureRequest.build(), null, cameraHandler)

上面的代码实现了预览功能,基本包含了从相机获取数据流的基本功能,如果我们想要拍照,需要使用ImageReader,可以看下面的例子。

4.3 拍照
//创建一个ImageReader
val imageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 3)//设置图片捕获后的回调
imageReader.setOnImageAvailableListener({ reader ->val image = reader.acquireNextImage()           }, imageReaderHandler)//创建Session支持的数据流
val targets = listOf(fragmentCameraBinding.viewFinder.holder.surface, imageReader.surface)//创建CameraCaptureSession
val session = createCaptureSession(camera, targets, cameraHandler)//创建CaptureRequest
val captureRequest = session.device.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).apply { addTarget(imageReader.surface) }//单次请求
session.capture(captureRequest.build(), null, handler)

因为拍照只需要捕获一次图像就行了,所以这里直接调用的capture()函数,而上面预览需要持续捕获调用的是setRepeatingRequest(),至于想要预览时支持点击拍照,可以先调用重复捕获在调用单次捕获,系统是支持交错捕获请求的。

4.4 视频

按照当前的框架,录制视频也容易多了,只需要添加一个新的数据流用来接收图像帧并且保存为视频文件就行了,为了实现这个功能,系统提供了两个比较好用的类MediaRecorder和MediaCodec。实际上MediaRecorder底层也是使用MediaCodec,简单点说就是MediaRecorder简化了录制音视频的流程,但是定制性相对较低,如果需要对音视频处理进行定制,可以使用MediaCodec。下面是简化后使用MediaRecorder的代码

TODO

https://developer.android.com/training/camera2/capture-sessions-requests?hl=zh-cn#kotlin

https://github.com/android/camera-samples

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

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

相关文章

算法与数据结构--二叉搜索树与自平衡二叉搜索树

0.字典(即c的map) 注:字典的 "member运算" 指的是检查字典中是否存在某个特定的键的操作,即查询操作。 如果我们使用数组来实现字典/map,虽然使用二分法查询也可以达到logn,但是的话插入和删除太…

SourceTree的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装:二、使用步骤1.获取地址2.放入sourceTree 3.点击推送 前言 提示:这里可以添加本文要记录的大概内容: 简单讲解一…

XV7001BB陀螺传感器

XV7001BB是一款工业级的高精度角度测量仪器,具备SPI或i2c串行接口,能够输出16位的角速率数据。同时,内置温度传感器可以实时监测环境温度,可选数字滤波器可以有效降低噪声干扰,使得测量结果更加准确可靠。作为一款低功…

Apache OFBiz 远程代码执行漏洞(CVE-2023-51467)

产品简介 Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。 漏洞概述 该系统的身份验证机制存在缺陷,可能允许未授权用户通过绕过标准登录流程来获取后台访问权限。此外&…

Visual Studio Code 中,通过显示波浪线来提示代码中存在的错误或警告

在Visual Studio Code (VSCode)中,编辑器会通过显示波浪线(也称为squiggles)来提示代码中存在的错误或警告。这些波浪线的颜色通常为红色表示错误,黄色表示警告。 1. 自定义错误和警告提示 • 打开设置:点击左上角菜单…

WebService

调试工具:Postman、SoapUI Soap WebService :.net WCF 、Java CFX WebService三要素: SOAP(Simple Object Access Protocol):用来描述传递信息的格式, 可以和现存的许多因特网协议和格式结合使用&#x…

了解英语中主语谓语宾语等等句子成分

目录 官方书面解释: 简介: 细分: 通俗易懂解释: 各个成分的解释: 扩展资料: 官方书面解释: 简介: 在句子中,词与词之间有一定的组合关系,按照不同的…

三分钟学完科研论文常用统计图

统计分析的结果通常包括统计图和统计表。统计图是一种用图形表示数据的方式,它能够直观地展示数据的分布、趋势和关系。科研论文中常见的统计图包括条形图、饼图、折线图、散点图等。这些图形可以帮助人们快速地理解和分析数据,找出其中的规律和特征。今…

赛宁综合安全验证评估,筑牢关基网络安全屏障

在国际复杂态势和数字经济发展的驱动下,关键信息基础设施(以下简称:关基)的安全运营逐步走向实战化、体系化和常态化。验证评估作为安全运营的试金石,已成为实现动态防御、主动防御的有力手段。如何通过体系化验证评估…

刷脸消费进入机关单位、企业员工消费应用场景

随着人脸识别技术的应用越来越广泛,刷卡消费已逐步被刷脸消费所替代。目前在一些高等院校、机关单位甚至是企业开始投入使用人脸消费机。与传统的刷卡识别技术相比,人脸识别技术具有以下优势: 无需持卡,方便人员使用。避免卡片丢…

DS18B20温度检测及其液晶显示

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 unsigned char code digit[10]{"0123456789"}; //定义字符数组显示数字 unsigned char code Str[]{"Test by DS18B20"}; //说明…

DP进阶之路——01背包问题

题目链接&#xff1a;题目页面 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&#xff0c;它们各自占据不…

web自动化上传文件

1&#xff0c;web 自动化文件上传不要太简单 熟悉 web 自动化测试的大佬应该都懂&#xff0c;当采用 js 调用原生控件进行文件上传的时候&#xff0c;最常用的是使用 pywin32 等系统交互库。 当看到 pywin32 那丑陋的 api 封装只能爆粗口。就为了输入一个文件地址&#xff0c;…

频谱论文:基于空间稀疏采样的频谱态势生成: 模型与算法

#频谱# 张国勇,王军,陈霄南等.基于空间稀疏采样的频谱态势生成:模型与算法[J].中国科学:信息科学,2022,52(11):2011-2036. &#xff08;电子科技大学&#xff09; 摘要 面对日益复杂的电磁频谱环境和持续增长的用频需求, 为了维护电磁频谱秩序和安全, 提高频谱资源整体利用效率…

《对话品牌》——魅力女人:成就幸福人生

本期节目《对话品牌》栏目组邀请到了北京紫琪尔健康管理集团董事长紫琪尔孙红宇女士参加栏目录制&#xff0c;分享其企业故事&#xff0c;树立品牌形象&#xff0c;提升品牌价值&#xff01; 节目嘉宾&#xff1a;紫琪尔集团董事长孙红宇 节目主持人&#xff1a;吴昊 节目播…

前端 -- 基础 常用标签 ( 图像标签及其属性详解)

目录 图像标签 &#xff1a; 插入图像 图像标签的其它属性 &#xff1a; alt 属性 title 属性 width 属性 height 属性 border 属性 注意 图像标签 &#xff1a; 在我们的网页中&#xff0c;可以看到 好多 好多 图片&#xff0c;那这些图片又是怎样 在…

Android画布Canvas drawPath绘制跟随手指移动的圆,Kotlin

Android画布Canvas drawPath绘制跟随手指移动的圆&#xff0c;Kotlin import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.os.Bundle import android.…

Java 类加载与字节码技术

3 类加载与字节码技术 3.1 类文件结构 类文件结构字节码指令编译期处理类加载阶段类加载器运行期优化 根据 JVM 规范&#xff0c;类文件结构如下 ClassFile {u4 magic;u2 minor_version; // 小版本号u2 major_version; // 主版本号u2 constant_pool_count; // 常量池cp_info…

算法时间空间复杂度计算—空间复杂度

算法时间空间复杂度计算—空间复杂度 空间复杂度定义影响空间复杂度的因素算法在运行过程中临时占用的存储空间讲解 计算方法例子1、空间算法的常数阶2、空间算法的线性阶&#xff08;递归算法&#xff09;3、二分查找分析方法一&#xff08;迭代法&#xff09;方法二&#xff…

WEB 3D技术 three.js 色彩空间讲解

上文 WEB 3D技术 three.js 设置环境贴图 高光贴图 场景设置 光照贴图 我们讲了基础材质的各种纹理 但是 我们的图片 到了界面场景中 好像绿的程度有点不太一样了 这里的话 涉及到我们的色彩空间 他有两种 一种是线性的 一种是 sRGB类型的 线性呢 就是根据光照强度 去均匀分…