Camera2 vs Camera1:为什么你应该升级到Camera2?

Unity 2022+ Cinemachine保姆级教程:从Camera组件平滑升级到智能相机系统(含多场景切换实战) 本文详细介绍了如何从Unity传统Camera组件平滑升级到Cinemachine智能相机系统,包括基础跟随功能改造、复杂镜头控制升级、智能镜头混合系统等实战技巧。特别适合需要提升镜头系统效率的开发者,通过Cinemachine实现多场景切换和动态避障,大幅减少代码量和调试时间。 阅读详情

Camera2 vs Camera1:为什么你应该升级到Camera2?

如果你还在用着老旧的Camera1 API为你的Android应用添加拍照功能,感觉就像是在用一台老式胶片相机进行数码摄影——虽然能出片,但过程繁琐,限制重重,而且总感觉错过了现代技术的便捷与强大。Camera2 API的出现,彻底改变了Android相机开发的格局,它不仅仅是一次简单的版本迭代,而是一次从“手动挡”到“自动挡”,甚至“赛车级手动模式”的跃迁。对于追求极致用户体验、需要实现高级拍摄功能(如专业模式、长曝光、多帧合成)的开发者而言,继续停留在Camera1无异于自我设限。本文将深入剖析Camera2的核心优势,并通过具体场景告诉你,升级不仅是趋势,更是构建高质量相机应用的必然选择。

1. 架构革新:从管道模型到会话请求模型

Camera1 API采用的是经典的“管道”模型。开发者需要按部就班地设置参数、启动预览、然后才能拍照。这个模型简单直观,但缺乏灵活性,整个流程是线性的、僵化的。想象一下,你只能按照“打开水龙头-接水-关水龙头”的顺序操作,中途想调整水温或水量非常困难。

Camera2 API则引入了全新的“会话-请求”模型。这个模型将相机抽象为一个提供图像数据的服务,而应用则成为向这个服务提交各种“订单”(即CaptureRequest)的客户。

1.1 核心组件解析

在Camera2的世界里,几个关键类扮演着不同角色,理解它们的关系是掌握Camera2的第一步。

  • CameraManager: 相机的“总管家”。它是一个系统服务,负责枚举设备上所有可用的摄像头(前置、后置、外接),并管理它们的生命周期。你通过它来获取摄像头的能力清单,并最终打开指定的摄像头设备。
  • CameraDevice: 代表一个具体的、已打开的物理摄像头。它是所有相机操作的基础,但本身不直接处理图像。它的核心职责是创建CameraCaptureSession。
  • CameraCaptureSession: 这是整个模型的心脏。一个会话代表应用与相机硬件之间建立的一个专属通信通道。所有向相机发出的指令,无论是预览、拍照还是录像,都必须通过这个会话提交。一个会话可以绑定多个输出目标(Surface),这是Camera2实现多路输出的关键。
  • CaptureRequest: 这就是发给相机的“订单”。它详细描述了单次图像捕获的所有要求:图像应该输出到哪个Surface、曝光时间多长、对焦模式是什么、是否开启闪光灯等等。每一个CaptureRequest对应一帧画面的处理参数,实现了帧级精确控制。
  • CaptureResult: 这是相机执行完一个CaptureRequest后返回的“收据”。它不包含图像数据本身,但包含了该帧图像捕获时的所有元数据(Metadata),例如实际使用的曝光值、对焦状态、时间戳等。这对于实现状态反馈和高级算法至关重要。
  • Surface: 图像数据的“目的地”。它是一块内存缓冲区,用于接收相机产生的图像流。SurfaceView、TextureView、ImageReader、MediaCodec等都可以提供Surface。

下表清晰地对比了两种模型的核心差异:

特性维度Camera1 (管道模型)Camera2 (会话-请求模型)
控制粒度流程级控制,参数设置相对全局。帧级控制,可为每一帧设置独立参数。
数据流通常为单一的预览流或拍照流。支持多路输出,可同时向多个Surface发送不同格式/尺寸的数据。
流程耦合预览、拍照、录像流程耦合紧密,切换繁琐。流程解耦,通过提交不同的Request实现功能切换,灵活高效。
状态获取回调信息有限,难以获取精确的每帧状态。通过CaptureResult提供丰富的每帧元数据,状态可监控。

1.2 会话的威力:一次配置,多种输出

创建CameraCaptureSession时,你需要传入一个Surface列表。这个列表定义了本次会话所有可能的图像输出目的地。一旦会话创建成功,你就可以通过提交不同的CaptureRequest,自由地决定将图像数据发送到哪一个或哪几个Surface,而无需重新配置或重启会话。

例如,你可以创建一个同时绑定以下三个Surface的会话:

  1. 一个用于TextureView显示的预览Surface(YUV_420_888格式)。
  2. 一个用于拍摄JPEG照片的ImageReader的Surface。
  3. 一个用于录制高清视频的MediaRecorder的Surface。

之后,在预览时,你提交的CaptureRequest只指向预览Surface;当用户按下拍照按钮时,你提交一个新的CaptureRequest,同时指向预览和JPEG Surface;开始录像时,则提交指向预览和录像Surface的Request。整个过程无缝切换,极大地提升了响应速度和用户体验。

提示:合理规划Surface的数量和格式。虽然Camera2支持多路输出,但受硬件和驱动限制,同时输出的流配置(分辨率、格式组合)必须是相机设备支持的。可以通过CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP查询所有支持的配置。

2. 颠覆性特性:Camera2独有的高级能力

Camera1的局限性在遇到复杂需求时暴露无遗。Camera2则打开了一扇新的大门,提供了许多过去只能在系统原生相机中见到的高级功能。

2.1 无需预览的静默拍照

在某些场景下,显示预览画面是不必要甚至不受欢迎的。例如后台定时拍照、文档扫描应用的自动捕获、或者某些安全验证场景。在Camera1中,你必须先启动预览才能拍照,这造成了资源浪费和潜在隐私问题。

Camera2彻底解决了这个问题。由于预览和拍照都被抽象为向会话提交CaptureRequest,你可以直接创建一个指向ImageReader Surface的CaptureRequest并提交,相机就会捕获一张照片并送到指定的ImageReader中,全程无需任何预览界面。

// 假设 cameraDevice 已打开,imageReader 已初始化并获取其 Surface
Surface captureSurface = imageReader.getSurface();
CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(captureSurface);
// 设置拍照参数,如JPEG质量、闪光灯模式等
captureBuilder.set(CaptureRequest.JPEG_QUALITY, (byte) 95);
CameraCaptureSession.CaptureCallback callback = ... // 处理拍照结果

// 创建仅用于拍照的会话(也可以复用已有的预览会话)
cameraDevice.createCaptureSession(Arrays.asList(captureSurface), new CameraCaptureSession.StateCallback() {
    @Override
    public void onConfigured(@NonNull CameraCaptureSession session) {
        session.capture(captureBuilder.build(), callback, backgroundHandler);
    }
}, backgroundHandler);

2.2 单次触发,多元捕获:同时获取不同格式和尺寸的图像

这是Camera2最强大的特性之一。在一次拍照指令中,你可以要求相机同时输出多种处理级别的图像数据。最常见的组合是:一张直接可用的高质量JPEG图片,加上一张包含原始传感器数据的RAW(DNG格式)文件。

这对专业摄影和后期处理意味着什么? JPEG文件是经过相机ISP(图像信号处理器)压缩和处理后的成品,方便直接分享。而RAW文件则保留了传感器最原始的感光数据,拥有更高的色深和动态范围,为后期调整白平衡、曝光、降噪提供了巨大的空间。Camera2让第三方应用也能实现类似专业单反的“JPEG+RAW”双格式记录。

实现的关键在于创建会话时,同时添加JPEG格式的ImageReader Surface和RAW格式的ImageReader Surface,然后在拍照的CaptureRequest中将这两个Surface都作为目标。

2.3 掌控光影:手动控制曝光时间

曝光时间(快门速度)是摄影的核心参数之一。在Camera1时代,应用层几乎无法直接干预这个参数,只能依赖自动曝光(AE)算法。Camera2则开放了CaptureRequest.SENSOR_EXPOSURE_TIME的手动控制。

长曝光的应用场景:

  • 夜景拍摄:延长曝光时间可以显著提升画面亮度,捕捉更多暗部细节。
  • 光绘与车流轨迹:利用长时间曝光记录光点的移动轨迹,创作创意摄影。
  • 提升预览亮度:在极暗环境下,甚至可以临时延长预览帧的曝光时间,让用户能看清构图,然后再用正常或更长的曝光时间进行最终拍摄。
// 获取相机支持的最大曝光时间(单位:纳秒)
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
Range<Long> exposureRange = characteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);
long maxExposureNs = exposureRange.getUpper();

// 在CaptureRequest中设置一个较长的曝光时间(例如1秒)
CaptureRequest.Builder previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewBuilder.addTarget(previewSurface);
if (maxExposureNs > 1_000_000_000L) { // 支持1秒以上曝光
    previewBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 1_000_000_000L); // 1秒
    previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF); // 必须关闭自动曝光
}
// 提交这个Request用于预览,用户将看到长曝光效果

注意:手动设置曝光时间时,通常需要同时将CONTROL_AE_MODE设置为OFF,并可能还需要手动设置感光度(ISO)。务必查询CameraCharacteristics确认设备支持哪些手动控制。

2.4 爆发式连拍与灵活3A控制

Camera2的“多次模式”(Burst)捕获使得实现高速连拍变得简单。你可以构建一个CaptureRequest列表,然后通过session.captureBurst()一次性提交。相机将以最高速率连续执行这些请求,期间不会被其他请求打断,确保了连拍的时序一致性。你甚至可以构建一个请求序列,让每一张连拍照片使用不同的曝光补偿或对焦距离,实现自动包围曝光或焦点堆栈的采集。

3A(自动对焦AF、自动曝光AE、自动白平衡AWB)的控制也更加精细化。你可以:

  • 监听3A状态:通过CaptureResult实时获取对焦是否锁定、曝光是否稳定、白平衡是否收敛等信息。
  • 触发并等待3A:在拍照前,先提交一个用于触发AF/AE的预捕获Request,并等待其状态变为成功,然后再提交真正的拍照Request,这能极大提升成片率。
  • 区域化控制:指定画面中特定的区域进行测光或对焦,而不是全局平均。

3. 迁移实战:从Camera1思维到Camera2思维

对于熟悉Camera1的开发者,迁移到Camera2需要一次思维转换。以下是一些关键的实践建议和常见陷阱的规避方法。

3.1 线程管理:远离主线程

Camera2的API设计是异步和非阻塞的,但很多操作本身(如打开相机、创建会话)可能涉及硬件初始化,是耗时的。绝对不要在UI主线程中直接调用Camera2的核心方法。最佳实践是使用一个专用的后台HandlerThread来处理所有相机操作。

private HandlerThread mCameraThread;
private Handler mBackgroundHandler;

private void startBackgroundThread() {
    mCameraThread = new HandlerThread("CameraBackground");
    mCameraThread.start();
    mBackgroundHandler = new Handler(mCameraThread.getLooper());
}

private void stopBackgroundThread() {
    mCameraThread.quitSafely();
    try {
        mCameraThread.join();
        mCameraThread = null;
        mBackgroundHandler = null;
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// 打开相机时,使用后台Handler
cameraManager.openCamera(cameraId, mStateCallback, mBackgroundHandler);

3.2 状态驱动编程:拥抱回调

Camera2的操作严重依赖于回调。设备状态(CameraDevice.StateCallback)、会话状态(CameraCaptureSession.StateCallback)和捕获结果(CameraCaptureSession.CaptureCallback)都是通过回调通知。这容易导致代码逻辑分散在各个回调方法中,变得“碎片化”。

应对策略:使用状态机或RxJava等响应式编程库来管理复杂状态。 对于简单场景,也可以使用CountDownLatch或Future在后台线程中进行同步等待,将异步回调“拉直”为同步代码,提高可读性。

// 示例:等待对焦成功的简化同步方法(在后台线程执行)
private boolean waitForFocusLock(CameraCaptureSession session, CaptureRequest.Builder builder) {
    final CountDownLatch latch = new CountDownLatch(1);
    final AtomicBoolean success = new AtomicBoolean(false);

    builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
    session.capture(builder.build(), new CameraCaptureSession.CaptureCallback() {
        @Override
        public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                       @NonNull CaptureRequest request,
                                       @NonNull TotalCaptureResult result) {
            Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
            if (afState != null &&
                (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
                 afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)) {
                success.set(true);
                latch.countDown();
            }
        }
    }, mBackgroundHandler);

    try {
        // 等待最多2秒
        return latch.await(2, TimeUnit.SECONDS) && success.get();
    } catch (InterruptedException e) {
        return false;
    }
}

3.3 资源生命周期管理:比以往更重要

Camera2的对象(CameraDevice, CameraCaptureSession, ImageReader)都是重要的系统资源,必须及时关闭。遵循“后申请先释放”的原则,在Activity/Fragment的onPause或onDestroy中妥善关闭它们。特别是ImageReader,在获取到Image后必须尽快调用Image.close(),否则会迅速耗尽缓冲区导致相机停顿。

4. 性能优化与最佳实践

掌握了基础功能和迁移方法后,要打造一流的相机应用,还需要关注性能与细节。

4.1 选择合适的模板

创建CaptureRequest.Builder时,需要传入一个模板类型。系统预定义了几个模板,它们预设了一组适合不同场景的参数:

  • TEMPLATE_PREVIEW: 适用于预览,优化了低延迟。
  • TEMPLATE_STILL_CAPTURE: 适用于高质量静态照片拍摄,优化了图像质量。
  • TEMPLATE_RECORD: 适用于视频录制,可能启用电子防抖等视频相关特性。
  • TEMPLATE_VIDEO_SNAPSHOT: 适用于在录像过程中拍照。
  • TEMPLATE_MANUAL: 最小化自动控制,为手动参数设置提供空白画布。

正确选择模板可以让你在默认状态下就获得较好的效果,然后再在其基础上进行自定义覆盖。

4.2 表面尺寸选择与比例匹配

选择预览和拍照的Surface尺寸时,需要考虑多方面因素:

  1. 设备支持:从StreamConfigurationMap获取支持的大小列表。
  2. 屏幕比例:预览尺寸应尽可能与显示它的TextureView/SurfaceView比例匹配,避免拉伸变形。
  3. 性能与功耗:更大的分辨率意味着更多的数据处理和传输开销。对于预览,通常选择1080p或720p足以平衡清晰度和性能。对于拍照,则选择你需要的最高质量尺寸。
  4. 格式兼容性:确保你选择的尺寸和格式组合(如YUV_420_888用于预览,JPEG用于拍照)在设备的支持列表中。

一个常见的做法是,先根据屏幕比例从支持列表中筛选出符合比例的尺寸,然后从中选择不大于显示区域且性能最优的一个作为预览尺寸。

4.3 处理图像数据:YUV、JPEG与RAW

Camera2直接提供了不同格式的图像数据,处理方式各异:

  • YUV_420_888: 最常用的预览和视频处理格式。它是一种平面(Planar)或半平面(Semi-Planar)格式,需要分别处理Y(亮度)、U、V(色度)三个平面。可以使用Image.getPlanes()获取各个平面进行图像处理或编码。
  • JPEG: 压缩后的静态图像。直接从ImageReader获取Image,然后将其ByteBuffer保存为文件即可。
  • RAW: 原始传感器数据。通常保存为DNG(数字负片)格式。处理RAW需要更多步骤,包括解析传感器标定信息(CameraCharacteristics中的COLOR_CORRECTION等),并写入DNG文件头。可以考虑使用Android的DngCreator工具类来简化这个过程。

升级到Camera2,初期学习曲线确实比Camera1陡峭,它要求开发者对相机的工作原理有更深的理解。但这份投入的回报是巨大的:你获得了对相机硬件前所未有的控制力,能够实现过去无法想象的功能,为用户提供媲美甚至超越系统相机的体验。在当今这个移动影像竞争白热化的时代,这无疑是构建差异化优势的关键。别再被过时的API束缚,是时候拥抱Camera2,释放你应用的影像潜力了。

避坑指南:高通Camera调试中那些容易搞混的prop属性(persist.camera vs persist.vendor.camera) 本文深入解析高通Camera调试中不同Android版本属性前缀的差异(如persist.camera与persist.vendor.camera),提供关键调试属性对照表和自动化检测脚本,帮助开发者避免常见配置错误,提升调试效率。适用于Qcom平台Camera模块开发与log分析。 阅读详情

相关推荐

Android Camera HAL版本演进与兼容性实战:从HAL1到HAL3,你的App该如何适配?

本文深入解析Android Camera HAL从HAL1到HAL3的版本演进与技术差异,提供多版本兼容适配方案和实战技巧。涵盖设备能力检测、双模式代码架构设计、关键兼容性问题解决方案及性能优化策略,帮助开发者高效适配不同HAL版本的Android设备,提升相机应用的兼容性和性能表现。

weixin_30457465的博客 216

Flutter 引擎开发实战:在 Android 上启用 Impeller 的 Vulkan 验证层(Vulkan Validation Layers)

本文基于 Flutter 引擎仓库内的 [Android Vulkan Validation Layers 官方指南](https://link.gitcode.com/i/f03e719a35f9aa619d1e58c8f839c71a),完整讲解如何用自定义引擎构建启用 Vulkan 验证层:从 `gn` 构建参数开始,到验证层 `.so` 如何被注入 Flutter 引擎 jar 包,再到运

gitblog_01123的博客 1122

Perfetto vs Systrace:MTK Camera 性能分析工具对比与迁移指南

本文深入对比了Perfetto和Systrace在MTK Camera性能分析中的应用,详细解析了两者的技术架构、数据采集方法和可视化能力差异。针对MTK Camera场景,重点介绍了Perfetto的特有功能如GPU渲染阶段追踪和相机流水线可视化,并提供了从Systrace迁移到Perfetto的完整指南,帮助开发者提升性能分析效率。

weixin_32175665的博客 257

如何用Wan2.1-Fun-V1.1-1.3B-Control-Camera制作电影级镜头视频:完整实战指南

**Wan2.1-Fun-V1.1-1.3B-Control-Camera** 是一款革命性的AI视频生成工具,专门用于从文本描述创建具有专业级相机镜头控制的视频内容。这个强大的AI模型能够将简单的文字提示转换成带有复杂相机运动的电影级视频,为内容创作者、视频制作人和AI爱好者提供了一个全新的创作平台。在本完整指南中,我将带您深入了解如何从零开始使用这个工具制作出令人惊艳的视频作品。 ## 🎬

gitblog_01157的博客 318

Camera传感器选型指南:YUV vs RAW,CCD vs CMOS,到底怎么选?

本文深入解析Camera传感器选型中的关键技术差异,包括YUV与RAW、CCD与CMOS的对比,提供实际应用场景的选择建议和选型方法论。帮助产品经理和硬件工程师在智能设备设计中做出最优决策,涵盖分辨率、动态范围、帧率和功耗等关键指标。

weixin_30955617的博客 567

Camera Sensor接口协议全解析(三):移动霸主——MIPI CSI-2架构拆解

作为智能手机摄像头的 **绝对统治者** ,MIPI CSI-2正以80%市占率横扫汽车/AR/无人机领域。本文将穿透协议迷雾,深度拆解 **四层架构** (应用/协议/通道/物理层),揭秘D-PHY与C-PHY的物理层博弈,最后展望CSI-2 v4.0如何用A-PHY重塑智能汽车生态

GateWorld的博客 1157

“camera_“:不是“pcl::visualization::PCLVisualizer“的成员

配置:VS2015+PCL1.8.1 问题:编译《点云库PCL从入门到精通》第五章可视化深度图像例程时编译器报错"camera_":不是"pcl::visualization::PCLVisualizer"的成员,报错代码如下: viewer.camera_.pos[0] = pos_vector[0]; viewer.camera_.pos[1] = pos_vector[1]; viewer.camera_.pos[2] = pos_vector[2]; viewer.camera_.f

sljslj111的博客 2130

高通Camera PDAF调试实战:从Type2到Type3的配置迁移避坑指南

本文深入解析了高通Camera平台PDAF从Type2到Type3架构迁移的核心差异与实战配置。针对调试中常见的相机启动失败、对焦失效等问题,提供了从XML配置修改、驱动层适配到全链路日志验证的完整避坑指南,帮助工程师高效完成技术升级。

sunny的博客 409

Android 8.0 Camera架构源码分析 - CameraProvider And CameraService启动

前一篇文章主要是android 7之前的流程,这篇看看android 8之后有哪里变化,对比会更能理解代码流程: Camera 服务启动流程概览 在 Android O 中,系统启动时,就会启动 CameraProvider 服务。它将 Camera HAL 从 cameraserver 进程中分离出来,作为一个独立进程 android.hardware.camera.provider@2.4-...

bailang9757的专栏 1863

Flutter相机库避坑指南:wechat_camera_picker从配置到权限处理的完整流程

本文详细介绍了Flutter相机库wechat_camera_picker的完整集成流程,包括环境准备、权限处理、高级功能开发及性能优化。特别针对Android 12+和iOS 14+的适配难题提供了解决方案,帮助开发者快速实现类微信的相机功能,提升应用的用户体验。

weixin_30772105的博客 381

Camera HAL3迁移手记:高通CamX框架在Android 11上的适配实战

本文深入解析了从高通QCamera2 HAL1向CamX HAL3框架迁移的实战经验。针对Android 11平台,文章详细对比了新旧架构的核心差异,重点剖析了CamX分层解耦的设计哲学、CameraProvider初始化流程、多摄场景下的流配置冲突解决方案,并提供了关键的接口映射与调试技巧,为系统工程师完成Camera HAL3迁移提供了全面的技术指南。

weixin_29306317的博客 64

工业相机接口选型指南:GigE Vision vs CoaXPress vs Camera Link,如何根据应用场景选择?

本文深入对比了工业相机三大主流数据接口GigE Vision、CoaXPress和Camera Link的核心差异。从带宽、传输距离、延迟确定性、系统成本及抗干扰能力等维度剖析,并结合多场景实战分析,为工业自动化、精密检测等领域的视觉系统选型提供决策指南,帮助工程师根据实际应用需求匹配最佳数据通道。

3a9bq4r8t2y的博客 254

OpenClaw 2.0机械臂控制框架升级实践指南

机械臂控制框架是工业自动化领域的核心技术,其核心原理通过运动学算法和实时控制实现精确轨迹跟踪。OpenClaw作为开源解决方案,在2.0版本中显著提升了多轴协同运动性能和模块化扩展能力。该升级通过优化动力学模型和改进碰撞检测算法,使机械臂在汽车装配等场景获得20%以上的稳定性提升。新版引入的视觉抓取模块和实时监控看板,结合改进的深度学习算法,大幅提升了反光金属件识别等复杂任务的执行效率。对于工程团队而言,掌握容器化升级方案和参数迁移技巧,能有效保障产线自动化设备的平稳过渡。

weixin_33716941的博客 402

Cocos Creator v1.5.2发布啦!

铛铛铛,被用户号称为「史上最稳beta」终于出正式版了,小伙伴可以不必再苦苦等待。什么,你们不信?有图有真相!1.5.2 版本在内测阶段就收获了大量积极的反馈,在上一个补丁版的基础上,进一步加强了稳定性并提升了工作效率。下面介绍主要版本特效。版本特色功能大幅提高脚本编译速度项目脚本增多时的编译速度一直是开发者们关注的问题,在1.5.2版本中我们进一步优化了脚本编译流程,使得每次改动项目脚本后的编译...

Cocos的博客 245

195、Camera 系统 OTA 升级策略:ISP 参数、AI 模型的空中更新与回滚机制

本文总结了Camera系统OTA升级的经验教训,重点探讨ISP参数、AI模型和固件的升级策略与回滚机制。作者通过真实案例(ISP参数升级导致相机崩溃)引出问题,提出分层升级方案(参数/模型/固件)。核心内容包括:增量更新与全量替换的对比、AI模型版本兼容性检查、双分区回滚方案设计、模型与代码的协同回滚,以及升级前的"干跑"验证机制。文章强调安全底线,提供了多个实用代码示例,如参数增量更新、模型版本校验和异常检测等关键实现细节。

sundong_81的博客 32

一篇教你杰理63系列蓝牙双设备主从连接传输数据过程及配置

首先打开632sdk的app_config.h文件,将宏CONFIG_APP_SPP_LE写0,将宏CONFIG_APP_MULTI写1,对应的CONFIG_BT_GATT_CLIENT_NUM写1代表我只连接一个主机设备。属性都可以修改为自己想要的属性,然后关掉文件,双击gatt_inc_generator.exe文件运行,就会自动弹出生成/更新后的gatt_profile_cfg.h文件,然后里面就是我们代码里面所需要的配置,都是十六进制表示,找到我们刚刚添加的服务属性配置,复制到代码里面去。

xiaolizaixian的博客 1379

VS2013跨平台移动开发:Cordova插件实战指南

跨平台开发框架通过共享代码库实现在多个操作系统上部署应用,其核心原理是将Web技术(HTML/CSS/JavaScript)封装为原生容器。Apache Cordova作为代表性解决方案,通过插件机制扩展设备API访问能力,显著降低了多平台适配成本。在工程实践中,Visual Studio集成开发环境为Cordova提供了强大的工具链支持,特别是VS2013时代的Visual Studio Tools for Apache Cordova插件,实现了开发环境稳定性与跨平台生产力的平衡。该方案适用于需要快速迭

weixin_33704591的博客 346

Unity 2018.1 Pro项目专业升级全流程:从风险评估到性能调优

在游戏开发领域,引擎版本升级是项目生命周期中的关键工程实践,它涉及对底层渲染管线、API接口和第三方依赖的系统性适配。其核心原理在于新版本引擎往往引入了更高效的渲染架构(如URP/HDRP)、更现代的脚本编译后端以及更完善的性能分析工具,以解决老版本在性能、功能和工作流上的瓶颈。从技术价值看,一次规划周密的升级能显著提升项目的可维护性、开发效率与运行时表现,并确保其能兼容最新的平台SDK与插件生态。典型的应用场景包括为引入Shader Graph等可视化工具、适配新移动操作系统或转向数据导向技术栈(DOTS

weixin_30709061的博客 312

Js逆向抖音a_bogus --/* V 1.0.1.19-fix.01 */补环境

需要在addEventListener中补一个鼠标移动事件,不补这个环境,生成的值是假值,你拿去请求,响应200,但是没有数据,这个算是dy的最难发现的一个难点。dy这个,没有原形链检测,我只是习惯了这样补,对XMLHttpRequest进行重写,导出a_bogus.发现可以响应状态码200,而且可以获取数据,接着注释params中的a_bogus。在n.apply的下面插入上述代码,对a_bogus进行全局导出。如果没有,就多放几次断点,因为每个人的游览器不一样。必须触发至少一次鼠标事件,不触发不给过。

2302_76420666的博客 4205

【学习系列】SAP RAP 4:通过注解来完成一些常规需求

本文介绍了RAP应用中常用注解的实现方式,包括搜索帮助、文本描述绑定、联动搜索、字段控制等功能。通过@Consumption、@UI等注解可以实现搜索帮助定义、多字段联动、必输校验、默认排序和默认值设置。管理字段可通过@Semantics注解自动记录创建/修改信息,长文本使用@UI.multiLineText实现多行显示。这些注解可优化界面交互和数据管理,为后续行为定义功能开发奠定基础。文章结构清晰,针对不同需求提供了具体的实现方案和代码示例。

DeveloperMrMeng的博客 700

VS2013下Cordova跨平台移动开发实战指南

跨平台移动开发通过一套代码基础实现多平台部署,Apache Cordova作为经典解决方案,利用Web技术封装原生功能。其核心原理是将HTML/CSS/JS代码运行在嵌入式WebView中,通过JavaScript桥接调用设备API。在工业控制、医疗设备等需要长期维护的传统行业项目中,VS2013集成的Cordova 5.0工具链仍具实用价值。本文以真实项目为例,详解如何在老旧开发环境中配置工具链、优化性能并处理兼容性问题,特别针对Android SDK部署、TypeScript集成等典型场景提供工程实践方

weixin_30235225的博客 639

软考高级网络规划设计师教程(第3版)

"本书是由工业和信息化部教育与考试中心组织编写的考试用书,依据《网络规划设计师考试大纲》(2026年审定通过)编写。本书分为两篇:第一篇为网络规划与设计综合知识,其中第1章介绍计算机网络基础知识,第2章介绍网络互连与互联网,第3章介绍网络规划与设计的知识和方法,第4章介绍网络资源设备,第5章介绍网络安全技术,第6章介绍标准化和网络安全法规;第二篇为案例实践,其中第7章介绍网络规划案例,第8章介绍网络故障分析与处理案例,第9章介绍网络安全部署案例,第10章介绍网络规划与设计论文写作的指导思想和写作技巧。

鹿鸣天涯 3948
上一篇: R 实战 | 利用compareCluster实现跨组基因功能富集比较与可视化
下一篇: 倒立摆控制避坑指南:LQR线性化常见错误与状态变量选择陷阱
github5actions
博客等级 码龄1天 0粉丝 1824原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值