Android Camera2 SessionConfiguration介绍和使用

一、介绍

最近在相机开发中发现 createCaptureSession(List, CameraCaptureSession.StateCallback, Handler) 已经被标记为过时(@Deprecated)的函数了,取而代之的是 createCaptureSession(SessionConfiguration) 函数。

缘由

随着 Camera 功能越来越复杂,创建 Session 的方法也随之越来越多,比如:

createCaptureSession(List<Surface>, CameraCaptureSession.StateCallback, Handler)createCaptureSessionByOutputConfigurations(List<OutputConfiguration>, CameraCaptureSession.StateCallback, Handler)createReprocessableCaptureSession(InputConfiguration, List<Surface>, CameraCaptureSession.StateCallback, Handler)createReprocessableCaptureSessionByConfigurations(InputConfiguration, List<OutputConfiguration>, CameraCaptureSession.StateCallback, Handler)createConstrainedHighSpeedCaptureSession(List<Surface>, CameraCaptureSession.StateCallback, Handler)createCustomCaptureSession(InputConfiguration, List<OutputConfiguration>, int, CameraCaptureSession.StateCallback, Handler)

于是便推出了 createCaptureSession(SessionConfiguration) 来统一。SessionConfiguration 是 Android API 28 新增的类,用于聚合捕获会话初始化的所有支持的参数。

二、常用方法

1. 构造函数

只有一个构造函数如下:

/*** @param sessionType 会话类型,目前有SESSION_REGULAR和SESSION_HIGH_SPEED两个值,后者为高速帧率范围,通常用于拍摄高速动作或慢动作视频* @param outputs 该会话输出的集合,不能为空* @param executor 用于调用回调的执行器,不建议使用主线程* @param cb 创建状态的回调函数,不能为空*/
public SessionConfiguration (int sessionType, List<OutputConfiguration> outputs, Executor executor, CameraCaptureSession.StateCallback cb)

2. 设置参数

用于设置Session创建时的使用的一些初始值。
因为这些值可以通过 CaptureRequest.Builder 在创建前就设置好然后传递给 Session 使用,可以用来根据不同的值选择相机Hal层使用的pipeline。

/*** @param params CaptureRequest.Builder的输出目标和不在CameraCharacteristics#getAvailableSessionKeys 中的参数值将会忽略,建议使用初始捕获请求相同的模板类型构建会话参数,以便会话和初始请求的参数尽可能匹配。*/
public void setSessionParameters (CaptureRequest params)

3. 判断 SessionConfiguration 是否支持

这个是 CemeraDevice 类的函数,一般也会使用到。

/*** @param sessionConfig 目标SessionConfiguration*/
public boolean isSessionConfigurationSupported (SessionConfiguration sessionConfig)

其余一些方法很少用,感兴趣的可以参考官网文档。

链接:https://developer.android.com/reference/android/hardware/camera2/params/SessionConfiguration

三、简单示例

一个简单的使用流程,熟悉一下创建流程。

// 创建一个 CaptureRequest.Builder 用于配置捕获请求
CaptureRequest.Builder previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(surface); // surface 是用于显示预览的 Surface 对象
ArrayList<OutputConfiguration> outputConfigurations = new ArrayList<>();
for (Surface surface : allSessionOutputs) { // allSessionOutputs是所有的 Surface 集合,包含预览+拍照等if (surface != null) {OutputConfiguration configuration = new OutputConfiguration(surface);outputConfigurations.add(configuration);}
}
// 创建和设置 SessionConfiguration
CameraCaptureSession.StateCallback sessionCreateCallback = new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {// 会话创建成功,您可以开始处理预览或拍照操作}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {// 会话创建失败,处理错误情况}
};
SessionConfiguration sessionConfiguration = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR, // SESSION_REGULAR或SESSION_HIGH_SPEEDoutputConfigurations,                 // 上面创建的ArrayList<OutputConfiguration>Context.getMainExecutor(),            // 回调的执行器,注意这里是不建议使用主线程的sessionCreateCallback);               // 回调函数
sessionConfiguration.setSessionParameters(previewRequestBuilder.build());
// 判断是否支持
try {boolean supported = cameraDevice.isSessionConfigurationSupported(sessionConfig);if (!supported) {// 处理不支持的情况}
} catch (CameraAccessException | IllegalArgumentException | NullPointerException e) {e.printStackTrace();// 处理异常的情况
}
// 创建捕捉会话
cameraDevice.createCaptureSession(sessionConfiguration);

四、自定义的回调执行器

因为不建议在主线程中执行回调,所以通常我们会创建一个相机的执行器。

1. 创建相机后台线程

这里的 mCameraHandler 同样可以用于 openCamera() 等函数使用。

private Handler mCameraHandler;
private HandlerThread mCameraThread;// 在打开相机的时候启动线程
private void startBackgroundThread() {if (mCameraThread == null || mCameraHandler == null) {mCameraThread = new HandlerThread("CameraBackground");mCameraThread.start();mCameraHandler = new Handler(mCameraThread.getLooper());}
}// 在关闭相机的时候停止线程
private void stopBackgroundThread() {if (mCameraThread != null) {mCameraThread.quitSafely();}
}
2. HandlerExecutor类

单独声明一个类或者内部类都可以。

public class HandlerExecutor implements Executor {private final Handler ihandler;public HandlerExecutor(Handler handler) {ihandler = handler;}@Overridepublic void execute(Runnable runCmd) {ihandler.post(runCmd);}
}
3. 使用

只需要替换掉之前例子中的 Context.getMainExecutor() 即可。

SessionConfiguration sessionConfiguration = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR, // SESSION_REGULAR或SESSION_HIGH_SPEEDoutputConfigurations,                 // 上面创建的ArrayList<OutputConfiguration>new HandlerExecutor(mCameraHandler),  // 回调的执行器,注意这里是不建议使用主线程的sessionCreateCallback);               // 回调函数

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

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

相关文章

适老产品反“坑老”,美的智能化家电是否能坐稳银发经济顺风车?

随着我国老龄化程度不断加深&#xff0c;银发经济崛起早已成为不争的共识。早在2013年&#xff0c;《中国老年人家电需求研究报告》就曾预测&#xff0c;仅在城镇空巢老年人家庭&#xff0c;每年产生的老年家电需求规模就超过600亿元&#xff0c;加上非空巢老人的需求&#xff…

再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的闪回功能

看腻文章了就来听听视频演示吧&#xff1a;https://www.bilibili.com/video/BV19m4y1V7jA/ 传统处理&#xff1a;全量备份增量binlog备份 模拟Oracle闪回&#xff1a;前提是binlog_formatROW drop table t_student; create table t_student(id int,name varchar(18),class in…

Array简介

概念&#xff1a; 数组&#xff08;Array&#xff09;是Java中最简单的数据结构之一&#xff0c;它用于存储固定大小的相同类型元素序列。数组是一个连续分配的内存块&#xff0c;可以通过索引访问其中的元素。元素在数组中按照顺序排列&#xff0c;并使用整数索引来唯一标识每…

Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar

原文网址&#xff1a;Spring注册Bean系列--方法5&#xff1a;ImportImportBeanDefinitionRegistrar_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;ImportImportBeanDefinitionRegistrar。 注册Bean的方法我写了一个系列&#xff0c;见&#xff…

MySQL基础-事务

目录 1.事务简介 2.事务的操作 2.1 实验需要用到的数据 2.2 完成转账操作 修改事务执行方式 手动开启事务的方式 3.事务的四大特性 4.并发事务问题 5.事务隔离级别 5.1 事务隔离级别分类 5.2 查看事务隔离级别 5.3 设置事务隔离级别 1.事务简介 事务是一组操作的集合…

Android---GC回收机制与分代回收策略

目录 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾回收算法 JVM 分代回收策略 1. 新生代 2. 老年代 GC Log 分析 引用 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾就是内存中已经没有用的对象&#xff0c;JVM 中的垃圾回收器(Garbage Collector)会自…

[CISCN2019 华北赛区 Day1 Web5]CyberPunk 二次报错注入

buu上 做点 首先就是打开环境 开始信息收集 发现源代码中存在?file 提示我们多半是包含 我原本去试了试 ../../etc/passwd 失败了 直接伪协议上吧 php://filter/readconvert.base64-encode/resourceindex.phpconfirm.phpsearch.phpchange.phpdelete.php 我们通过伪协议全…

入侵防御系统(IPS)网络安全设备介绍

入侵防御系统&#xff08;IPS&#xff09;网络安全设备介绍 1. IPS设备基础 IPS定义 IPS&#xff08;Intrusion Prevention System&#xff09;是一种网络安全设备或系统&#xff0c;用于监视、检测和阻止网络上的入侵尝试和恶意活动。它是网络安全架构中的重要组成部分&…

部署在阿里云ECS服务器上的微服务项目中获取到的时间和windows的时间不一样的问题

继上一篇文章《阿里云ECS服务器无法发送邮件问题解决方案》之后&#xff0c;又发现登录的时候发送邮件中的时间和自己windows上的时间不一样&#xff0c;大概找了一下原因&#xff0c;是LocaDateTime使用的时区不一样导致的远程服务器和本机时间不一致。 只需要在LocaDateTime…

Aria2 for Mac (免HomeBrew)

Aria2 for Mac (免HomeBrew)-CSDN博客 之前搜索Aria2的安装方法&#xff0c;推荐的方法是使用HomeBrew安装。是&#xff0c;这个插件很省事&#xff0c;但启用条件是你安装了HomeBrew且运行起来需要再下十来个G的Xcode…… 这对急用的我非常不友好&#xff0c;当然&#xff0c…

设计模式 - 创建型模式考点篇:工厂模式、建造者模式

目录 一、创建型模式 1.1、工厂模式 1.1.1、简单工厂模式&#xff08;非 23 种经典设计模式&#xff09; 概述 案例 1.1.2、静态工厂&#xff08;扩展&#xff09; 1.1.3、工厂方法模式 概念 案例 1.2、建造者模式 1.2.1、概念 1.2.2、案例 1.2.3、建造者模式扩展&…

Pandas数据结构

文章目录 1. Series数据结构1.1 Series数据类型创建1.2 Series的常用属性valuesindex/keys()shapeTloc/iloc 1.3 Series的常用方法mean()max()/min()var()/std()value_counts()describe() 1.4 Series运算加/减法乘法 2. DataFrame数据结构2.1 DataFrame数据类型创建2.2 布尔索引…

计算机视觉中的可解释性分析

计算机视觉中的可解释性分析是指通过不同的方法和技术来解释和理解深度学习模型对图像或视频数据的预测和决策过程。这是一个非常重要的领域&#xff0c;因为深度学习模型通常被认为是“黑盒子”&#xff0c;很难理解其内部工作原理。可解释性分析的目标是提供对模型决策的更好…

vue3使用知识点总结

一、vue3 项目搭建 npm 6.x npm init vitelatest myvue3 --template vuevue 3.2.26使用 element plus ui 框架 npm i -S element plus//全部引入 import ElementPlus from element-plus; import element-plus/dist/index.css; const Vue createApp(App); Vue.use(ElementPl…

1Panel开源面板项目(https://github.com/1Panel-dev)

1Panel开源面板项目&#xff08;https://github.com/1Panel-dev&#xff09;自2023年3月发布以来&#xff0c;受到了很多社区用户的喜爱。作为一款现代化、开源的Linux服务器运维管理面板&#xff0c;1Panel为用户提供免费的服务器搭建与管理资源服务 优点&#xff1a;安装方式…

腾讯会议录制没有声音?看完这篇你就懂了

“腾讯会议录制的视频怎么没有声音呀&#xff1f;老师用腾讯会议上网课&#xff0c;就想用腾讯会议内置的录屏功能录下来&#xff0c;可是录制的视频没有声音&#xff01;真的服了&#xff0c;有没有人知道怎么解决的&#xff0c;帮帮忙。” 腾讯会议是一种常用的远程会议工具…

基于遗传算法的新能源电动汽车充电桩与路径选择(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

iTOP-RK3588开发板使用 tensorflow框架

TensorFlow 是一个软件库或框架&#xff0c;由 Google 团队设计&#xff0c;以最简单的方式实现机器学习和深度学习概念。它结合了优化技术的计算代数&#xff0c;便于计算许多数学表达式。TensorFlow 有以下 重要功能 - 它包含一个叫做张量概念&#xff0c;用来创建多维数组&…

【密评】商用密码应用安全性评估从业人员考核题库(五)

商用密码应用安全性评估从业人员考核题库&#xff08;五&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 1001 单项选择题 下列分组密码认证模式中&#xff0c;使用密钥最少的…

深入浅出DAX:购买推荐及产品ABC分类分析

深入浅出DAX&#xff1a;购买推荐及产品ABC分类分析 DAX运算求值的三步骤。首先是检测筛选&#xff0c;然后将筛选功能应用于基础表格&#xff0c;最后计算结果。DAX中的筛选器函数是复杂且功能强大的函数。例如筛选函数可用于操作数据上下文来创建动态计算。 01、使用细节说…