Android Camera API 介绍
一 StreamConfigurationMap
1. StreamConfigurationMap 的作用
StreamConfigurationMap
是 Android Camera2 API 中的一个核心类,用于描述相机设备支持的输出流配置,包含以下信息:
- 支持的格式与分辨率:例如
YUV_420_888
、JPEG
、RAW
等格式及其对应的分辨率列表。 - 输入/输出流组合规则:例如哪些格式可以同时用于
预览
、拍照
或录像
。 - 硬件能力限制:例如是否支持
硬件级图像处理
(如YUV 重处理
)、动态范围模式
(HDR)等。 - 帧率与时长限制:如某些分辨率下支持的最小/最大帧率,或视频录制的最大时长。
应用通过 CameraCharacteristics
获取 StreamConfigurationMap
,并基于此配置合理的 CaptureSession
(例如选择预览和拍照的兼容分辨率)。
2. 与 cameraprovider 交互关系
(1) 数据来源
- CameraProvider 提供原始数据:
Camera HAL 实现(如android.hardware.camera.provider@2.4
)通过getCameraCharacteristics()
方法向框架上报硬件能力,包括支持的流配置(格式、分辨率、动态范围等)。 - 框架封装为 StreamConfigurationMap:
框架层(如CameraService
)解析 HAL 返回的元数据,将其转换为应用可直接使用的StreamConfigurationMap
。
(2) 配置流程示例
- 应用请求相机能力:
应用调用CameraManager.getCameraCharacteristics(cameraId)
。 - 框架查询 HAL:
CameraService
通过CameraProvider
的 HAL 接口获取该相机的元数据。 - HAL 返回底层配置:
CameraProvider
从硬件或板级配置文件(如cam_board.xml
)中读取支持的流配置,传递给框架。 - 构建 StreamConfigurationMap:
框架将原始数据(如SCALER_AVAILABLE_STREAM_CONFIGURATIONS
)封装为StreamConfigurationMap
对象。 - 应用使用配置:
应用根据StreamConfigurationMap
选择兼容的流组合(例如同时支持1080p@30fps
预览和12MP
拍照)。
(3) 关键数据结构对应
HAL 元数据字段(如 android.scaler ) | StreamConfigurationMap 方法 | 作用 |
---|---|---|
SCALER_AVAILABLE_STREAM_CONFIGURATIONS | getOutputSizes(int format) | 获取某格式支持的分辨率列表 |
SCALER_AVAILABLE_MIN_FRAME_DURATIONS | getOutputMinFrameDuration(int format) | 获取某分辨率下最小帧间隔(决定最大帧率) |
REQUEST_AVAILABLE_CAPABILITIES | isOutputSupportedFor(int useCase) | 检查是否支持特定用例(如 ZSL) |
3. 实际示例
假设一个相机设备支持以下配置(通过 CameraProvider
上报):
- YUV_420_888: 1920x1080@30fps, 1280x720@60fps
- JPEG: 4000x3000@10fps
则 StreamConfigurationMap
会生成如下信息:
// 获取 YUV 格式支持的分辨率
Size[] yuvSizes = streamConfigMap.getOutputSizes(ImageFormat.YUV_420_888);
// 结果: [1920x1080, 1280x720]// 检查是否支持硬件级 YUV 重处理
boolean isReprocessSupported = streamConfigMap.isOutputSupportedFor(CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);
StreamConfigurationMap
是应用层获取相机输出能力的接口,而 CameraProvider
是底层硬件能力的提供者。前者依赖后者上报的元数据,二者共同实现 硬件能力到应用接口的透明映射,是 Android Camera 系统分层架构的核心设计之一。
在 Android 相机系统(Camera2 API)中,OutputConfiguration
和 StreamConfigurationMap
是与相机输出流配置相关的两个关键类,它们在相机工作流程中扮演不同角色。以下是它们的详细介绍及关系分析:
二. OutputConfiguration
1 作用
作用:
OutputConfiguration
是 Android 5.0(API 21)引入的类,用于定义单个相机输出流的配置。它的核心功能包括:
-
封装输出目标(如
Surface
或SurfaceView
)。 -
配置物理相机(在多摄像头设备中指定物理传感器)。
-
管理共享输出流(允许多个
Surface
共享同一输出流)。 -
使用场景:
当创建CameraCaptureSession
时,需传入一组OutputConfiguration
对象,描述所有输出流。 -
关键方法:
addSurface(Surface surface)
:添加共享的Surface
。setPhysicalCameraId(String id)
:指定物理相机(用于双摄/多摄设备)。getSurfaces()
:获取关联的Surface
列表。
-
示例:
// 创建 ImageReader 并获取 Surface ImageReader imageReader = ImageReader.newInstance(width, height, format, maxImages); Surface imageSurface = imageReader.getSurface();// 创建 OutputConfiguration OutputConfiguration outputConfig = new OutputConfiguration(imageSurface);// 可选:配置共享 Surface 或物理相机 // outputConfig.addSurface(anotherSurface); // outputConfig.setPhysicalCameraId("2");// 创建 CameraCaptureSession List<OutputConfiguration> outputConfigs = new ArrayList<>(); outputConfigs.add(outputConfig); cameraDevice.createCaptureSessionByOutputConfigurations(outputConfigs, callback, handler);
2. 与 StreamConfigurationMap 关系
-
协作流程:
- Step 1:通过
StreamConfigurationMap
查询设备支持的输出参数(格式、分辨率等)。 - Step 2:根据合法参数创建输出目标(如
ImageReader
或SurfaceView
)。 - Step 3:将输出目标封装到
OutputConfiguration
,用于创建CameraCaptureSession
。
- Step 1:通过
-
依赖关系:
OutputConfiguration
的参数(如格式、分辨率)必须符合StreamConfigurationMap
的约束,否则会话创建会失败。StreamConfigurationMap
提供理论支持,OutputConfiguration
负责实际配置。
-
扩展功能:
OutputConfiguration
支持高级功能(如多摄像头共享输出流),而StreamConfigurationMap
仅描述硬件能力。- 在 Android 10(API 29)后,
OutputConfiguration
新增对动态分辨率、物理摄像头绑定的支持。
3. 常见问题
-
Q1: 为什么需要同时使用两者?
A:是相机设备的“能力说明书”,告诉开发者硬件支持哪些输出配置。
OutputConfiguration是实际构建输出流的“施工图”,将合法的参数绑定到具体的
Surface`。 -
二者配合确保相机输出流的正确性和高效性
-
Q2: 如何避免
InvalidSurfaceException
?
A: 确保OutputConfiguration
的Surface
参数(格式、分辨率)在StreamConfigurationMap
的合法范围内。 -
Q3: 多摄像头场景如何处理?
A: 使用OutputConfiguration.setPhysicalCameraId()
指定物理摄像头,并通过StreamConfigurationMap
检查该摄像头是否支持目标参数。
总结
StreamConfigurationMap
是相机设备的“能力说明书”,告诉开发者硬件支持哪些输出配置。OutputConfiguration
是实际构建输出流的“施工图”,将合法的参数绑定到具体的Surface
。- 二者配合确保相机输出流的正确性和高效性,是 Camera2 API 中不可或缺的组件。
在 Android Camera2 API 中,CameraCaptureSession
是管理相机数据流和捕获请求的核心组件。它与 OutputConfiguration
密切相关,共同决定了相机的输出目标(如预览、拍照、录像等)的配置和运行机制。以下是详细解释及其与 OutputConfiguration
的关系:
三 CameraCaptureSession
1. 作用
CameraCaptureSession
是相机设备(CameraDevice
)与输出目标(Surface
)之间的桥梁,负责:
- 管理输出流:绑定多个
Surface
(如预览的SurfaceView
、拍照的ImageReader
),并确保数据正确传输到这些目标。 - 提交捕获请求:通过
capture()
或setRepeatingRequest()
发送请求(CaptureRequest
),控制相机的行为(如自动对焦、曝光、帧率等)。 - 处理异步事件:监听相机状态(如对焦完成、帧捕获完成)并回调给应用。
2 生命周期
- 创建:通过
CameraDevice.createCaptureSession()
或createCaptureSessionByOutputConfigurations()
创建。 - 活动状态:可提交捕获请求,相机数据流向绑定的
Surface
。 - 关闭:调用
close()
释放资源,不可再发送请求。
3.创建 CameraCaptureSession
创建会话时,需要指定一组输出目标(Surface
或 OutputConfiguration
)。两种方法:
-
传统方式(基于
Surface
列表):cameraDevice.createCaptureSession(List<Surface> outputs, // 直接传递 Surface 列表CameraCaptureSession.StateCallback callback, Handler handler );
- 适用于简单场景,但灵活性有限(例如不支持多摄像头或动态分辨率)。
-
基于
OutputConfiguration
的方式(API 21+,扩展功能在后续版本增强):cameraDevice.createCaptureSessionByOutputConfigurations(List<OutputConfiguration> outputConfigurations, // 封装了 Surface 的高级配置CameraCaptureSession.StateCallback callback,Handler handler );
- 支持更复杂的配置(如共享流、物理摄像头绑定、动态分辨率等)。
4. 与 OutputConfiguration 的关系
(1) OutputConfiguration 是会话的输入
-
功能:
OutputConfiguration
封装了一个或多个Surface
的配置信息,用于定义输出流的特性:- 单个或共享的
Surface
:通过addSurface()
添加多个Surface
,共享同一数据流(例如预览和录像共享同一帧数据)。 - 物理摄像头绑定:在双摄/多摄设备中,通过
setPhysicalCameraId()
指定输出流来自哪个物理摄像头。 - 动态分辨率(API 23+):允许在会话运行时动态调整分辨率(需硬件支持)。
- 单个或共享的
-
优势:相比直接传递
Surface
列表,OutputConfiguration
提供了更细粒度的控制能力。
(2) 创建会话的流程
- 查询设备支持:通过
StreamConfigurationMap
确认相机支持的格式和分辨率。 - 创建输出目标:根据合法参数创建
Surface
(如ImageReader
、SurfaceView
)。 - 封装为 OutputConfiguration:将
Surface
及其附加配置(如物理摄像头)封装到OutputConfiguration
。 - 创建会话:调用
createCaptureSessionByOutputConfigurations()
,传入OutputConfiguration
列表。
(3) 关键约束
- 不可变性:一旦
CameraCaptureSession
创建成功,其绑定的OutputConfiguration
不可修改(如新增或移除Surface
)。若需更改,必须关闭当前会话并重新创建。 - 硬件限制:
OutputConfiguration
的配置(如分辨率、格式)必须符合StreamConfigurationMap
的支持范围。
4. 示例:使用 OutputConfiguration 创建会话
// 创建两个输出目标:预览 Surface 和拍照 ImageReader
SurfaceView surfaceView = ... // 预览的 SurfaceView
ImageReader imageReader = ImageReader.newInstance(4032, 3024, ImageFormat.JPEG, 3);// 封装为 OutputConfiguration
OutputConfiguration previewConfig = new OutputConfiguration(surfaceView.getHolder().getSurface());
OutputConfiguration captureConfig = new OutputConfiguration(imageReader.getSurface());// 可选:配置共享流或物理摄像头
// previewConfig.addSurface(anotherSurface); // 共享同一个流
// captureConfig.setPhysicalCameraId("1"); // 指定物理摄像头List<OutputConfiguration> outputConfigs = new ArrayList<>();
outputConfigs.add(previewConfig);
outputConfigs.add(captureConfig);// 创建 CameraCaptureSession
cameraDevice.createCaptureSessionByOutputConfigurations(outputConfigs, new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {// 会话就绪,可提交 CaptureRequest}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {// 配置失败(参数不合法或硬件问题)}}, null // 可选 Handler
);
5. 高级功能与兼容性
-
共享流(Shared Surfaces):
- 多个
Surface
共享同一输出流(例如预览和 AI 分析共享数据),减少内存和功耗。 - 实现方式:通过
OutputConfiguration.addSurface()
添加多个Surface
。
- 多个
-
动态分辨率(Dynamic Resolution)(API 23+):
- 允许在会话运行时动态调整输出分辨率(需设备支持)。
- 通过
OutputConfiguration.setDynamicRangeProfile()
配置。
-
多摄像头支持(API 28+):
- 在双摄设备中,通过
OutputConfiguration.setPhysicalCameraId()
指定输出流来源。
- 在双摄设备中,通过
6. 常见问题与解决方案
-
问题1:
createCaptureSession
失败,错误为IllegalArgumentException
。
原因:OutputConfiguration
参数不合法(如分辨率超出支持范围)。
解决:检查StreamConfigurationMap
的合法参数。 -
问题2:无法在运行时修改输出流。
原因:CameraCaptureSession
的配置不可变。
解决:关闭当前会话,重新创建新的会话。 -
问题3:多摄像头场景下数据流混乱。
原因:未正确指定setPhysicalCameraId()
。
解决:确保每个OutputConfiguration
绑定到正确的物理摄像头。
总结
CameraCaptureSession
:是相机数据流的核心控制器,负责管理输出目标和捕获请求。- 与
OutputConfiguration
的关系:OutputConfiguration
是会话的输入,定义了每个输出流的具体配置(如Surface
、物理摄像头)。CameraCaptureSession
通过OutputConfiguration
的配置,确保数据流符合硬件能力(由StreamConfigurationMap
定义)。- 使用
OutputConfiguration
可以启用高级功能(如共享流、多摄像头),而传统Surface
列表方式功能受限。
通过合理使用 OutputConfiguration
,开发者可以更灵活地配置相机输出流,满足复杂场景的需求(如多摄、动态分辨率、低功耗共享流)。
相关文章:
Android Camera API 介绍
一 StreamConfigurationMap 1. StreamConfigurationMap 的作用 StreamConfigurationMap 是 Android Camera2 API 中的一个核心类,用于描述相机设备支持的输出流配置,包含以下信息: 支持的格式与分辨率:例如 YUV_420_888、JPEG、…...
活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁
课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动,了解如何更好地在 Microsoft 365 Defen…...
RabbitMQ 消息顺序性保证
方式一:Consumer设置exclusive 注意条件 作用于basic.consume不支持quorum queue 当同时有A、B两个消费者调用basic.consume方法消费,并将exclusive设置为true时,第二个消费者会抛出异常: com.rabbitmq.client.AlreadyClosedEx…...
web第二次作业
一.后台管理系统首页代码 1.html代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>实验&l…...
AI 编程开发插件codeium Windsurf(vscode、editor) 安装
1、vscode中安装: 2、vscode中使用 3、输入注册的账号密码,就可以使用。 4、或者直接下载editor 5、安装editor 下一步,下一步,直到安装成功,中间可以改下安装位置,如果C盘空间不够。 同样提示注册或者登录…...
变压器-000000
最近一个项目是木田12V的充电器,要设计变压器,输出是12V,电压大于1.5A12.6*1.518.9W. 也就是可以将变压器当成初级输入的一个负载。输入端18.9W. 那么功率UI 。因为变压器的输入是线性上升的,所以电压为二份之一,也就是1/2*功率…...
C# OpenCvSharp 部署MOWA:多合一图像扭曲模型
目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA:多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…...
Ai无限免费生成高质量ppt教程(deepseek+kimi)
第一步:打开deepseek官网(DeepSeek) 1.如果deepseek官网网络繁忙,解决方案如下: (1)使用easychat官网(EasyChat)使用deepseek模型,如图所示: (2)本地部署&…...
LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略
LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略 目录 Logic-RL的简介 1、Logic-RL的特点 2、性能 Logic-RL 的安装和使用方法 1、安装 2、使用方法 数据准备 基础模型 指令模型 训练执行 实现细节 Logic-RL的案例应用 Logic-RL…...
解决跨域问题
相信大多数的伙伴在第一次通过vue spring 做项目的时候都会遇到这个问题 什么是同源策略和跨域问题 同源策略指的就是,浏览器出于安全考虑,实施的一种策略,即只允许来自同一源(即协议域名端口都相同)的请求访问资源. 否则就会导致跨域问题 例如: http://xxx.com -> http…...
网络工程师 (28)IEEE802标准
前言 IEEE 802标准是由电气和电子工程师协会(IEEE)制定的一组局域网(LAN)和城域网(MAN)标准,定义了网络中的物理层和数据链路层。 一、起源与背景 IEEE 802又称为LMSC(LAN/MAN Stand…...
Playwright 与 Selenium 的关系
Playwright 与 Selenium 的关系 Playwright 和 Selenium 都是流行的浏览器自动化测试工具,它们都可以用于 Web 应用的端到端测试,但它们在设计理念、架构和功能上存在一些差异。 以下是两者的主要关系对比: 特性PlaywrightSelenium开发语言JavaScript (Node.js)多种语言 (…...
保研考研机试攻略:python笔记(4)
🐨🐨🐨15各类查找 🐼🐼二分法 在我们写程序之前,我们要定义好边界,主要是考虑区间边界的闭开问题。 🐶1、左闭右闭 # 左闭右闭 def search(li, target): h = len(li) - 1l = 0#因为都是闭区间,h和l都可以取到并且相等while h >= l:mid = l + (h - l) // 2…...
Matplotlib基础01( 基本绘图函数/多图布局/图形嵌套/绘图属性)
Matplotlib基础 Matplotlib是一个用于绘制静态、动态和交互式图表的Python库,广泛应用于数据可视化领域。它是Python中最常用的绘图库之一,提供了多种功能,可以生成高质量的图表。 Matplotlib是数据分析、机器学习等领域数据可视化的重要工…...
Spring Boot: 使用 @Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ
Spring Boot: 使用 Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ 在微服务架构中,确保消息的可靠性和一致性非常重要,尤其是在涉及到分布式事务的场景中。本文将演示如何使用 Spring Boot 的事务机制和 TransactionSynchron…...
解析3DMAX转OBJ
3ds Max 是一款功能强大的三维建模、动画和渲染软件,而 OBJ 是一种常用的三维模型文件格式,以下是关于 3ds Max 转 OBJ 的相关解析: 3ds Max 转 OBJ 的原因 兼容性需求: OBJ 格式被众多三维软件和渲染器所支持,将 3…...
html为<td>添加标注文本
样式说明: /*为td添加相对定位点*/ .td_text {position: relative; }/*为p添加绝对坐标(相对于父元素中的定位点)*/ .td_text p {position: absolute;top: 80%;font-size: 8px; }参考资料:...
AI驱动的智能流程自动化是什么
在当今快速发展的数字化时代,企业正在寻找更高效、更智能的方式来管理日常运营和复杂任务。其中,“AI驱动的智能流程自动化”(Intelligent Process Automation, IPA)成为了一个热门趋势。通过结合人工智能(AIÿ…...
vue动态table 动态表头数据+动态列表数据
效果图: <template><div style"padding: 20px"><el-scrollbar><div class"scrollbar-flex-content"><div class"opt-search"><div style"width: 100px"> </div><div class"opt-b…...
ubuntu下迁移docker文件夹
在 Ubuntu 系统中迁移 Docker 文件夹(如 Docker 数据存储文件夹 /var/lib/docker)到另一个磁盘或目录,通常是为了释放系统盘空间。以下是迁移过程的详细步骤: 1. 停止 Docker 服务 在进行迁移之前,必须停止 Docker 服…...
Neo4j图数据库学习(二)——SpringBoot整合Neo4j
一. 前言 本文介绍如何通过SpringBoot整合Neo4j的方式,对图数据库进行简单的操作。 Neo4j和SpringBoot的知识不再赘述。关于Neo4j的基础知识,有兴趣可以看看作者上一篇的文章:Neo4j图数据库学习(一)——初识CQL 二. 前置准备 新建SpringBo…...
离散型变量的 PSI-群体稳定性指标计算
文章目录 PSI-群体稳定性指标(离散型)单个指标计算所有指标计算 PSI-群体稳定性指标(离散型) 单个指标计算 代码 import pandas as pddf pd.read_csv(/Users/mengzhichao/Desktop/文件/图表/小微企业用电量数据.csv)X_train df.sample(n7000) X_test df.sample(n3000)计算单…...
docker grafana安装
mkdir /root/grafana-storage chmod 777 -R /root/grafana-storage docker run -d -p 3000:3000 --namedocker-apisix-grafana-1 --network docker-apisix_apisix -v /root/grafana-storage:/var/lib/grafana grafana/grafana:9.1.0 浏览器访问: http://192.…...
NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理 + ids4鉴权
网关 OcelotGeteway 网关 Ocelot配置文件 {//单地址多实例负载均衡Consul 实现动态伸缩"Routes": [{// 上游 》》 接受的请求//上游请求方法,可以设置特定的 HTTP 方法列表或设置空列表以允许其中任何方法"UpstreamHttpMethod": [ "Get", &quo…...
【进度条实现】Python中tqdm使用示例
tqdm 是 Python 中一个非常流行的进度条库,可以快速为循环或长时间运行的任务添加进度提示。以下是 tqdm 的常见用法和示例: 1. 安装 pip install tqdm2. 基本用法 在循环中使用 最简单的用法是用 tqdm 包装一个可迭代对象(如列表、range …...
Chirpy3D:用于创意 3D 鸟类生成的连续部分潜在特征
Chirpy3D框架可以将细粒度的2D图像理解提升至3D生成的全新境界。当前的3D生成方法往往只关注于重构简单的对象,缺乏细致的特征和创造性。Chirpy3D通过结合多视角扩散模型和连续的部件潜在空间,能够生成全新且合理的3D鸟类模型。该系统不仅能够保持细致的…...
李飞飞团队 S1 与 DeepSeek R1 技术对比
李飞飞团队 S1 与 DeepSeek R1 技术对比 李飞飞团队的 S1 模型和 DeepSeek R1 模型都是在 AI 推理领域具有重要影响力的模型,它们在技术原理、性能表现和训练成本等方面存在一些差异。 技术原理 S1 模型:S1 模型采用了监督微调(SFT…...
LeetCode 3444.使数组包含目标值倍数的最小增量
给你两个数组 nums 和 target 。 在一次操作中,你可以将 nums 中的任意一个元素递增 1 。 返回要使 target 中的每个元素在 nums 中 至少 存在一个倍数所需的 最少操作次数 。 示例 1: 输入:nums [1,2,3], target [4] 输出:…...
Node.js 中模块化
随着软件开发项目的规模和复杂性的增加,如何有效地组织代码、提高可维护性和促进团队协作成为了一个重要的课题。Node.js 提供了强大的模块系统,使得开发者能够将代码分割成独立的、可重用的模块,从而简化大型应用的开发过程。本文将详细介绍…...
jdk8新特性
目录 1 lambda表达式 1.1 类型推断 1.2 局部变量限制 2 函数式接口 2.1 Predicate 函数式接口 2.2 Supplier函数式接口 2.3 Consumer函数式接口 2.4 Function函数式接口 2.5 Runnable函数式接口 3 方法引用和构造器引用 3.1 对象方法引用 3.2 静态方法引用 3.3 构造方法引用 4 …...
ZooKeeper 和 Dubbo 的关系:技术体系与实际应用
引言 在现代微服务架构中,服务治理和协调是至关重要的环节。ZooKeeper 和 Dubbo 是两个在分布式系统中常用的技术工具,它们之间有着紧密的联系。本文将详细探讨 ZooKeeper 和 Dubbo 的关系,从基础概念、技术架构、具体实现到实际应用场景&am…...
ESP32-S3模组上跑通esp32-camera(43)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(42) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...
解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException
解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 目录 解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 问题描述解决步骤解决方案结论附:MySql常用配置参数及使用场景 在使用Spring Boot连接MySQL数据库时,有时候会遇到“B…...
NCV4275CDT50RKG 车规级LDO线性电压调节器芯片——专为新能源汽车设计的高可靠性电源解决方案
产品概述: NCV4275CDT50RKG 是一款符合 AEC-Q100 车规认证的高性能LDO(低压差线性稳压器),专为新能源汽车的严苛工作环境设计。该芯片支持 输出调节为 5.0 V 或 3.3 V,最大输出电流达 450mA,具备超低静态电流…...
DeepSeek Window本地私有化部署
前言 最近大火的国产AI大模型Deepseek大家应该都不陌生。除了在手机上安装APP或通过官网在线体验,其实我们完全可以在Windows电脑上进行本地部署,从而带来更加便捷的使用体验。 之前也提到过,本地部署AI模型有很多好处,比如&…...
镜头放大倍率和像素之间的关系
相互独立的特性 镜头放大倍率:主要取决于镜头的光学设计和结构,决定了镜头对物体成像时的缩放程度,与镜头的焦距等因素密切相关。比如,微距镜头具有较高的放大倍率,能将微小物体如昆虫、花朵细节等放大成像࿰…...
【RabbitMQ重试】重试三次转入死信队列
以下是基于RabbitMQ死信队列实现消息重试三次后转存的技术方案: 方案设计要点 队列定义改造(核心参数配置) Bean public Queue auditQueue() {Map<String, Object> args new HashMap<>();args.put("x-dead-letter-exchan…...
【一文读懂】卫星轨道的轨道参数(六根数)和位置速度矢量转换及其在终端距离、相对速度和多普勒频移计算中的应用
卫星轨道的六根数参数及其在终端距离、相对速度和多普勒频移计算中的应用 卫星轨道运动的描述离不开开普勒六要素(也称为六根数参数),它们完整地刻画了一颗卫星在引力场中的轨道信息。本文将介绍这六个参数的意义,并探讨如何利用…...
车载诊断框架 --- 使用CAPL脚本实现诊断测试吧(中)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
Lockdir加密忘记密码:解锁数据恢复之道
Lockdir加密忘记密码现象解析 Lockdir作为一款知名的文件夹加密软件,因其强大的加密功能和便捷的操作体验而广受用户好评。然而,当谈及Lockdir加密忘记密码这一情况时,不少用户却面露难色。Lockdir加密忘记密码,简而言之…...
SQL优化方式
避免select *:开发中禁止使用select * 。它会增加查询解析器成本,无法走索引覆盖而产生回表操作,还会增加网络消耗,浪费CPU和内存资源,应指定具体查询字段。小表驱动大表:关联查询时,用数据量小…...
java项目之基于推荐算法的图书购物网站源码(ssm+mybatis+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于推荐算法的图书购物网站项目。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于推荐算法的…...
java中的线程安全
线程安全的定义 线程安全:一个类或方法在多线程环境下可以被多个线程同时访问,而不会导致数据的不一致或错误。 线程不安全:一个类或方法在多线程环境下不能被多个线程同时访问,否则可能导致数据的不一致或错误。线程安全的实现 线…...
day44 QT核心机制
头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QLabel> //标签类头文件 #include<QPushButton> //按钮类头文件 #include<QLineEdit> //行编辑器类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …...
字节跳动后端一面
📍1. Gzip压缩技术详解 Gzip是一种流行的无损数据压缩格式,它使用DEFLATE算法来减少文件大小,广泛应用于网络传输和文件存储中以提高效率。 🚀 使用场景: • 网站优化:通过压缩HTML、CSS、JavaScript文件来…...
WebSocket推送数据快,条数多导致前端卡顿问题解决
WebSocket推送数据快,条数多导致前端卡顿问题解决 前言方案优化消息频率使用高效的数据格式Protobuf 和 MessagePack的对比 启用压缩前端性能优化 WebSocket使用注意事项连接管理处理断开连接负载均衡监控和维护日志记录定期维护安全最佳实践限流 最后 前言 在项目…...
android动态设置是否允许应用卸载
摘要:通过广播设置全局参数控制应用是否允许卸载,全局参数在Launcher和PackageInstaller两个模块中使用到。此功能可用于MDM后台控制是否允许设备卸载应用。 1. 静态注册广播 由于系统安装和卸载的功能集中在PackageInstaller模块中,为了更…...
【C/C++】每日温度 [ 栈的应用 ] 蓝桥杯/ACM备赛
数据结构考点:栈 题目描述: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高࿰…...
开启蓝耘之旅:DeepSeek R1 模型在智算平台的起步教程
----------------------------------------------------------我的个人主页-------------------- 动动你的手指----------------------------------------点赞👍 收藏❤--------------------------------------------------------------- 引言 在深度学习的广袤领…...
基于SpringBoot+Vue实现航空票务管理系统
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...