当前位置: 首页 > news >正文

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

相关文章:

Android Camera

1. 相关的API Android有三套关于摄像头的API(库),分别是Camera、Camera2和CameraX,其中Camera已废弃,在Android5.0以后推荐使用Camera2和CameraX,Camera2推出是用来替换Camera的,它拥有丰富的API可以为复杂的用例提供…...

Python开发雷点总结

数值运算(加减乘除) 1. invalid value赋值 当变量本身具有数值属性(后续会参加数值运算),对invalid value设置应该为np.nan, 而非None;反之,容易抛出以下错误: TypeEr…...

Linux中磁盘管理与文件系统

目录 一.磁盘基础: 1.磁盘的结构: 2.硬盘的数据结构: 3.硬盘存储容量 : 4.硬盘接口类型: 二.MBR与磁盘分区: 1.MBR的概念: 2.硬盘的分区: 为什么分区: 2.表示&am…...

Vue2+element-ui 实现select选择器结合Tree树形控件实现下拉树效果

效果&#xff1a; DOM部分 &#xff1a; // 设置el-option隐藏的下拉选项&#xff0c;选项显示的是汉字label&#xff0c;值是value // 如果不设置一个下拉选项&#xff0c;下面的树形组件将无法正常使用 <el-form-item label"报警区域" prop"monitorId"…...

LINUX 解决系统卡死:扩大内存交换分区

最近电脑总是卡住&#xff0c;让我很是苦恼。运行程序时发现可能是内存占满之后导致界面卡住。下面是在我16G内存的电脑上折腾的过程与结果&#xff1a; 查看当前的交换内存大小free -m&#xff08;单位&#xff1a;-m选项表示以兆字节&#xff08;MB&#xff09;为单位显示内…...

Vue项目Nginx代理F5刷新出现404问题解决

一.背景 项目用户反馈&#xff0c;F5刷新后&#xff0c;浏览器出现404。最近公司加强网络管理&#xff0c;我记得之前可以刷新&#xff0c;有点怀疑是跟加强网络管理有关。具体原因没有时间去深度跟踪&#xff0c;先百度找到了解决方法&#xff0c;记录一下。 二.解决办法 主…...

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结 测试一&#xff1a;没有添加 自动转化的配置&#xff0c;且domain中的属性名称和数据库的字段名称一致测试二&#xff1a;没有添加自动转化配置i&#xff0c;domain属性名userPassword和数据…...

css中的BFC

定义 BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域&#xff0c;只有Block-level box参与&#xff0c; 它规定了内部的Block-level Box如何布局&#xff0c;并且与这个区域外部毫不相干。 涉及概念 box Box 是 CSS 布局的对象…...

音视频类App广告变现如何破局,最大化广告变现收益,让应用增收?

音视频App已然成为了我们日常获取、发布和交换信息的重要方式&#xff0c;在音视频行业不断的拓展中&#xff0c;用户的渗透率提升。 据数据显示&#xff0c;我国网络视听用户的规模已达9亿人次&#xff0c;网民使用率也突破了90%。庞大的市场规模和用户需求吸引了大批开发者和…...

基于llama-index对embedding模型进行微调

QA对话目前是大语言模型的一大应用场景&#xff0c;在QA对话中&#xff0c;由于大语言模型信息的滞后性以及不包含业务知识的特点&#xff0c;我们经常需要外挂知识库来协助大模型解决一些问题。在外挂知识库的过程中&#xff0c;embedding模型的召回效果直接影响到大模型的回答…...

如何本地搭建FastDFS文件服务器并实现远程访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…...

spring基于Xml管理bean---Ioc依赖注入:对象类型属性赋值(2)----内部bean的引入(bean和bean之间的引入)、(3)级联方式注入

bean创建对象类型赋值方式 第一&#xff1a;外部bean的引入 第二&#xff1a;内部bean的引入 第三&#xff1a;级联属性赋值 文章目录 bean创建对象类型赋值方式对象类型内部bean赋值代码分析总结 对象类型属性级联方式的赋值扩展知识 对象类型内部bean赋值 代码分析 <b…...

Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类

目录 前言 1 电能质量数据集制作与加载 1.1 导入数据 1.2 制作数据集 2 CNN-2D分类模型和训练、评估 2.1 定义CNN-2d分类模型 2.2 定义模型参数 2.3 模型结构 2.4 模型训练 2.5 模型评估 3 CNN-1D分类模型和训练、评估 3.1 定义CNN-1d分类模型 3.2 定义模型参数 …...

如何解决报错:Another app is currently holding yum lock?

在运行yum 相关命令的时候&#xff0c;不知道怎么回事无法进行下载安装&#xff0c;报出 Another app is currently holding the yum lock; waiting for it to exit... 的错误提示。 Another app is currently holding the yum lock. 意思是另外一个应用正在锁住进程锁。 …...

electron使用electron-builder进行MacOS的 打包、签名、公证、上架、自动更新

一、前言 由于electron在macOS下的坑太多&#xff0c;本文不可能把所有的问题都列出来&#xff0c;也不可能把所有的解决方案贴出来&#xff1b;本文也不太会讲解每一个配置点为什么要这么设置的原因&#xff0c;因为有些点我也说不清&#xff0c;我尽可能会说明的。所以&…...

RAD Studio 12 安装激活说明及常见问题

目录 RAD Studio 安装说明 RAD Studio 最新的修补程序更新 RAD Studio 产品相关信息 Embarcadero 产品在线注册步骤 单机版授权产品注册注意事项 Embarcadero 产品离线注册步骤 Embarcadero 产品安装次数查询 Embarcadero 序号注册次数限制 EDN账号 - 查询授权序号、下…...

JavaScript实现视频共享

1.视频共享webrtc-master index.html <!DOCTYPE html> <html> <head><script typetext/javascript srchttps://cdn.scaledrone.com/scaledrone.min.js></script><meta charset"utf-8"><meta name"viewport" cont…...

uniapp框架——vue3+uniFilePicker+fastapi实现文件上传(搭建ai项目第二步)

文章目录 ⭐前言&#x1f496; 小程序系列文章 ⭐uni-file-picker 组件&#x1f496; 绑定事件&#x1f496; uploadFile api&#x1f496; 自定义上传 ⭐后端fastapi定义上传接口⭐uniapp开启本地请求代理devServer⭐前后端联调⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是ym…...

一篇文章带你入门PHP魔术方法

PHP魔术方法 PHP 中的"魔术方法"是一组特殊的方法&#xff0c;它们在特定情况下自动被调用。这些方法的名称都是以两个下划线&#xff08;__&#xff09;开头。魔术方法提供了一种方式来执行各种高级编程技巧&#xff0c;使得对象的行为可以更加灵活和强大。以下是一…...

【数据库系统概论】第6章-关系数据库理论

真别看吧&#xff0c;抄ppt而已啊 文章目录 6.1 引言6.2 规范化6.2.1 函数依赖6.2.2 码6.2.3 范式&#xff08;Normal Form&#xff09;6.2.4 BC范式6.2.5 规范化小结 6.1 引言 我们有这样一张表&#xff1a; but 为啥这样设计呢&#xff1f;由此引出怎样设计一个关系数据库…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...