Android Camera2 API实战:构建自定义相机应用,实现多流捕获与手动控制
1. 项目概述重新定义你的相机视角“reCamera”这个名字乍一听可能有点抽象但如果你是一个经常用手机拍照、录视频或者对影像创作有点想法的人这个概念可能会让你眼前一亮。简单来说reCamera 不是一个具体的App或硬件而是一种理念和一系列技术实践的集合它探讨的核心问题是我们能否超越手机原生相机App的固定框架获得更底层、更灵活、更符合专业创作需求的影像控制能力我们每天都在用手机记录生活但你是否曾感到过束缚比如想同时录制前置和后置摄像头的画面制作Vlog原生相机做不到想精细控制视频的码率、帧率、色彩采样以匹配后期流程原生相机选项有限甚至你想获取相机传感器的原始数据流进行AI分析或开发AR应用原生相机更是大门紧闭。这些“痛点”正是reCamera理念试图解决的。它面向的是那些不满足于“傻瓜式”拍摄希望将手机摄像头作为真正创作工具或开发平台的影像爱好者、内容创作者、独立开发者和极客。其核心价值在于“重新掌控”Re-control。通过调用操作系统提供的底层相机API如Android的Camera2 API或iOS的AVFoundation绕过标准相机应用的封装直接与摄像头硬件“对话”。这意味着你可以实现多路流同时捕获、手动控制所有曝光参数快门、ISO、白平衡、获取未经压缩的图像数据YUV或RAW格式甚至实现自定义的实时预览滤镜和计算机视觉处理管线。这不仅仅是“功能更多”而是从“用户”到“导演”的视角转变让你能按照自己的构思去设计和实现一套专属的拍摄工作流。2. 核心理念与技术栈拆解2.1 为什么需要“重新”发明轮子手机的原生相机App是厂商在易用性、画质、功耗和安全性之间精心权衡的产物。它追求的是让绝大多数用户“按下即得”好照片因此做了大量自动化处理自动对焦、自动曝光、HDR合成、夜景多帧降噪等。这套流程是黑盒的用户无法干预其内部决策。对于普通记录这很棒但对于创作和开发这就成了瓶颈。举个例子你想做一个高动态范围的延时摄影希望锁定ISO以控制噪点仅让快门速度根据光线变化。大多数原生相机的“专业模式”可能允许你这么做但当你切换到延时功能时这些手动控制又失效了系统接管了一切。reCamera的思路就是拆掉这堵墙直接使用底层API构建你自己的拍摄逻辑让“专业模式”渗透到所有拍摄形态中。另一个关键点是数据获取。原生相机拍完的照片/视频是经过ISP图像信号处理器充分处理并编码压缩后的成品如JPEG、HEVC。而许多高级应用需要更原始的数据机器学习模型训练需要YUV数据计算摄影研究需要RAW数据AR应用需要实时的帧数据流进行空间计算。这些都需要直达传感器数据源这正是reCamera技术栈的核心能力。2.2 核心支撑技术栈解析实现reCamera能力需要深入操作系统提供的相机框架。这里以覆盖面最广的Android平台为例其核心是Camera2 API。Camera2 API vs. 旧版Camera API旧版Camera API采用简单的“命令-响应”模式难以应对复杂的并发和精细控制。Camera2 API则引入了基于管道的模型将相机设备抽象为一个数据源可以同时向多个不同的“目标”Surface输出数据流。这正是实现画中画、双景录像、数据预览并行处理的基础。关键组件与流程CameraManager系统的相机服务门户用于发现和打开摄像头设备。CameraCharacteristics相机的“身份证”和“能力说明书”查询所有硬件特性如支持的输出尺寸、可用闪光灯模式、是否支持RAW等。CameraDevice代表一个打开的摄像头连接。通过它创建CaptureSession。CaptureRequest定义了“一次拍摄请求”的所有参数。这是控制的核心你可以为其设置CaptureRequest.CONTROL_AE_MODE自动曝光模式为OFF以完全手动控制并分别设置SENSOR_EXPOSURE_TIME快门速度和SENSOR_SENSITIVITYISO。CaptureSession一个配置好的管道关联了CameraDevice和一个或多个输出目标Surface例如用于预览的TextureView的Surface用于编码的MediaRecorder的Surface用于内存分析的ImageReader的Surface。ImageReader这是获取原始图像数据的关键。你可以配置它来获取指定格式如ImageFormat.YUV_420_888,ImageFormat.RAW10和尺寸的图像数据然后从Image对象中获取字节数据进行处理。一个典型的高级reCamera会话配置可能是这样的// 伪代码逻辑示意 SessionConfig { OutputTarget_1: Surface (来自 PreviewView) // 用于实时预览 OutputTarget_2: Surface (来自 MediaRecorder) // 录制1080p H.264视频 OutputTarget_3: ImageReader (YUV_420_888, 最大分辨率) // 同时进行AI人脸检测 OutputTarget_4: ImageReader (RAW10, 最大分辨率) // 保存RAW文件用于后期 }通过一个CaptureSession和多个CaptureRequest例如一个用于预览的低分辨率连续请求一个用于拍照的高分辨率单次请求你就可以同步驱动以上所有输出这正是原生相机App无法提供的灵活性。注意能力越强责任越大。直接操作底层API会带来显著的复杂性提升你需要妥善管理相机的状态机、生命周期在Activity暂停时及时关闭、以及多线程下的数据同步图像数据回调通常在后台线程否则极易引发应用崩溃或资源泄漏。3. 实战构建一个基础reCamera应用理论说得再多不如动手搭一个。下面我们以Android平台为例分步拆解如何构建一个具备手动拍照和获取YUV数据能力的reCamera应用。这里假设你已有Android开发基础。3.1 环境准备与权限配置首先创建一个新的Android项目。在AndroidManifest.xml中声明必要的权限和特性uses-permission android:nameandroid.permission.CAMERA / !-- 如果录音还需要麦克风权限 -- uses-permission android:nameandroid.permission.RECORD_AUDIO / uses-feature android:nameandroid.hardware.camera android:requiredtrue / uses-feature android:nameandroid.hardware.camera.autofocus android:requiredfalse / !-- 非必需 --由于相机是敏感权限需要在运行时动态申请。在Activity中使用ActivityResultContracts.RequestPermission来优雅地处理权限请求。3.2 相机生命周期管理这是最易出错的部分。必须确保相机资源的打开、关闭与Activity/Fragment的生命周期严格同步。class CameraActivity : AppCompatActivity() { private lateinit var cameraExecutor: ExecutorService private var cameraDevice: CameraDevice? null private var captureSession: CameraCaptureSession? null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) cameraExecutor Executors.newSingleThreadExecutor() // 用于相机回调的线程池 } override fun onResume() { super.onResume() if (权限已授予) { openCamera() // 打开相机 } } override fun onPause() { super.onPause() closeCamera() // 必须关闭 } override fun onDestroy() { super.onDestroy() cameraExecutor.shutdown() } private fun openCamera() { val cameraManager getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId ... // 选择后置摄像头 cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() { override fun onOpened(device: CameraDevice) { cameraDevice device createCaptureSession() // 创建会话 } override fun onDisconnected(device: CameraDevice) { closeCamera() } override fun onError(device: CameraDevice, error: Int) { closeCamera() } }, null) // 回调在cameraExecutor线程执行 } private fun closeCamera() { captureSession?.close() captureSession null cameraDevice?.close() cameraDevice null } }实操心得永远在onPause中关闭相机而不是onStop。因为当弹出另一个透明Activity如权限对话框时会触发onPause但不触发onStop此时相机应被释放以供其他应用使用。此外所有相机回调StateCallback,CaptureCallback都可能在工作线程触发更新UI务必切回主线程。3.3 配置输出目标与创建会话假设我们的目标是1. 在TextureView上预览2. 可以点击按钮拍摄一张最高质量的照片保存3. 同时获取YUV数据流用于实时灰度图显示。private lateinit var previewView: TextureView private lateinit var imageReaderForCapture: ImageReader // 用于拍照 private lateinit var imageReaderForYuv: ImageReader // 用于YUV流 private fun createCaptureSession() { val texture previewView.surfaceTexture texture.setDefaultBufferSize(previewSize.width, previewSize.height) val previewSurface Surface(texture) // 配置用于拍照的ImageReader (JPEG格式) imageReaderForCapture ImageReader.newInstance( captureSize.width, captureSize.height, ImageFormat.JPEG, 2 ).apply { setOnImageAvailableListener({ reader - // 在这里保存JPEG图片 val image reader.acquireNextImage() // ... 将image转为byte[]并保存文件 image.close() }, cameraExecutor) } // 配置用于YUV流的ImageReader imageReaderForYuv ImageReader.newInstance( previewSize.width, previewSize.height, ImageFormat.YUV_420_888, 3 ).apply { setOnImageAvailableListener({ reader - val image reader.acquireNextImage() // 处理YUV数据例如转换为灰度图 processYuvImage(image) image.close() }, cameraExecutor) } val targets Arrays.asList(previewSurface, imageReaderForCapture.surface, imageReaderForYuv.surface) cameraDevice?.createCaptureSession(targets, object : CameraCaptureSession.StateCallback() { override fun onConfigured(session: CameraCaptureSession) { captureSession session // 会话创建成功开始预览 startPreview() } override fun onConfigureFailed(session: CameraCaptureSession) { showToast(会话配置失败) } }, null) }这里的关键是ImageReader的maxImages参数第二个ImageReader的3。它定义了可以同时排队在内存中的图像数量。如果处理速度跟不上相机帧率这个缓冲区会被填满新的图像将无法获取或导致旧图像被丢弃。对于实时处理需要平衡分辨率、帧率和处理算法复杂度。3.4 实现手动控制与拍摄创建两个CaptureRequest.Builder一个用于持续预览TEMPLATE_PREVIEW一个用于静态拍照TEMPLATE_STILL_CAPTURE。private fun startPreview() { val previewRequestBuilder cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply { addTarget(previewSurface) // 输出到预览 addTarget(imageReaderForYuv.surface) // 同时输出到YUV ImageReader // 设置为手动曝光模式 set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF) set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF) // 设置手动参数例如ISO 100, 1/30秒快门 set(CaptureRequest.SENSOR_SENSITIVITY, 100) set(CaptureRequest.SENSOR_EXPOSURE_TIME, TimeUnit.SECONDS.toNanos(1)/30) } captureSession?.setRepeatingRequest(previewRequestBuilder?.build(), null, null) } fun takePicture() { val captureRequestBuilder cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).apply { addTarget(imageReaderForCapture.surface) // 输出到JPEG ImageReader // 拍照时可以使用自动模式也可以沿用或覆盖手动参数 set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO) set(CaptureRequest.JPEG_QUALITY, 95.toByte()) // 设置方向确保照片方向正确 val rotation windowManager.defaultDisplay.rotation val sensorOrientation characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION) val jpegOrientation (sensorOrientation rotation * 90 360) % 360 set(CaptureRequest.JPEG_ORIENTATION, jpegOrientation) } captureSession?.capture(captureRequestBuilder?.build(), null, null) }通过setRepeatingRequest启动预览流通过capture执行单次拍照。手动参数的设置是reCamera的精髓你可以根据环境光传感器读数或自己的算法动态调整这些参数实现自动模式无法做到的创意效果比如长曝光光绘或高帧率慢动作需要设备支持。4. 高级应用场景与性能调优4.1 典型应用场景实现思路双景录像/画中画创建两个MediaRecorder实例分别获取其Surface。在创建CaptureSession时将这两个Surface都加入目标列表。然后使用一个CaptureRequest同时向这两个Surface发送数据流。难点在于音频处理通常需要选择一路音频源或混合处理。高帧率慢动作首先通过CameraCharacteristics查询CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES找到设备支持的高帧率范围如[120, 120]。在创建预览CaptureRequest时通过set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range(highFps, highFps))进行设置。录制时需要使用支持该高帧率的编码格式和参数。RAWDNG格式拍摄检查CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES是否包含REQUEST_AVAILABLE_CAPABILITIES_RAW。如果支持创建一个ImageReader格式指定为ImageFormat.RAW_SENSOR或ImageFormat.RAW10等。获取到Image后需要按照DNG数字负片标准封装元数据如感光度、白平衡、色彩矩阵等这是一个复杂的过程通常借助如libraw或Camera2的DngCreator工具类来完成。实时AI滤镜/AR在ImageReaderYUV格式的OnImageAvailableListener中将获取的YUV图像数据快速转换为AI模型所需的输入格式如RGB张量送入模型如TensorFlow Lite进行推理得到结果如分割掩膜、姿态关键点。然后在预览的Surface上通过OpenGL ES或Canvas将原图和结果叠加渲染。性能瓶颈在YUV转换和模型推理必须使用GPUOpenGL/Vulkan或NPU进行加速。4.2 性能优化与避坑指南reCamera应用是资源消耗大户不当实现会导致卡顿、发热、耗电快。1. 分辨率与帧率的权衡不是所有摄像头都支持所有分辨率下的高帧率。通过CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP可以查询每个输出格式如ImageFormat.YUV_420_888,ImageFormat.JPEG支持的具体尺寸和帧率组合。选择预览分辨率时不必追求最高匹配预览视图的大小即可通常1080p足够。拍照和视频录制分辨率根据需求选择。同时输出多个流时系统可能会自动降低某些流的帧率或分辨率以维持稳定。2. ImageReader的缓冲区管理务必在onImageAvailable回调中尽快调用acquireNextImage()获取图像并在处理完毕后立即调用image.close()释放缓冲区。如果处理耗时如AI推理考虑在后台线程池中进行但释放操作必须在获取图像后最终执行。可以设置ImageReader的maxImages参数略大于预期处理速度作为缓冲。3. 对焦与测光区域的精细控制Camera2 API允许你通过MeteringRectangle定义对焦和测光区域。这对于专业拍摄非常有用。你可以监听预览画面的触摸事件将触摸点坐标转换为传感器坐标然后创建并设置CaptureRequest.CONTROL_AF_REGIONS和CONTROL_AE_REGIONS。fun setFocusArea(touchX: Float, touchY: Float) { // 将触摸点坐标转换为传感器区域坐标过程略 val meteringRect MeteringRectangle(sensorRectX, sensorRectY, width, height, weight) val meteringRectArray arrayOf(meteringRect) previewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectArray) previewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectArray) // 触发对焦 previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START) captureSession?.setRepeatingRequest(previewRequestBuilder.build(), ...) }4. 兼容性处理不同厂商、不同型号的手机对Camera2 API的支持程度称为“硬件支持级别”INFO_SUPPORTED_HARDWARE_LEVEL差异巨大。有LEGACY,LIMITED,FULL,LEVEL_3等级别。LEGACY设备几乎等同于旧版Camera API很多高级功能如手动控制、RAW拍摄不可用。在开发时必须检查特性并做降级处理。例如在LIMITED设备上可能无法同时开启手动曝光和对焦。5. 常见问题排查与调试技巧即使按照最佳实践开发在实际设备上仍会遇到各种问题。以下是一些常见坑点及排查思路。问题1预览画面黑屏或卡住。检查清单TextureView的SurfaceTexture是否已经准备好onSurfaceTextureAvailable回调被触发后才去打开相机相机权限是否真正被授予动态权限请求的结果处理是否正确createCaptureSession时传入的Surface列表是否有效特别是MediaRecorder或ImageReader的Surface需要在配置完成后再获取。预览的CaptureRequest是否成功通过setRepeatingRequest发送出去了检查回调是否有错误。调试技巧在CameraCaptureSession.CaptureCallback的onCaptureFailed方法中打印日志查看失败原因。问题2拍照保存的图片方向错误。原因手机摄像头传感器方向是固定的通常是横屏方向而手机屏幕可以旋转。系统需要根据设备方向对图像进行旋转校正。解决方案如3.4节代码所示正确计算JPEG_ORIENTATION并设置到拍照请求中。对于预览可以通过TextureView.setTransform(matrix)来旋转预览画面以匹配UI方向。问题3应用运行一段时间后崩溃日志显示“CameraDevice was closed”或“MAX_CAMERAS_IN_USE”。原因相机资源未正确释放或泄漏。排查确保所有CameraDevice、CameraCaptureSession、ImageReader、MediaRecorder都在Activity/Fragment的onPause或相应生命周期中正确关闭close()。确保没有在相机回调如onImageAvailable中长时间持有Image对象不释放。检查是否在相机尚未完全关闭onClosed回调未触发时又尝试去打开新的相机会话。问题4同时开启预览和录像时预览变得非常卡顿。原因相机硬件或总线带宽不足以同时处理高分辨率预览和高码率编码输出。优化降低预览流的分辨率例如从4K降到1080p。降低录像的帧率或码率。检查设备支持的“流组合”Stream Combination。使用CameraManager.getCameraCharacteristics(cameraId)后通过SCALER_STREAM_CONFIGURATION_MAP的getOutputStallDuration和getOutputMinFrameDuration来评估不同组合的性能或直接使用Camera2Compat等库来查询推荐配置。问题5在某些设备上手动控制参数ISO、快门设置无效。原因设备硬件支持级别低LIMITED或LEGACY不支持全手动控制。处理在应用启动时检查CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL。对于不支持全手动的设备隐藏高级控制UI或改用自动模式下的曝光补偿CONTROL_AE_EXPOSURE_COMPENSATION进行有限调整。开发reCamera类应用是一个深入理解移动影像系统的过程充满了挑战但也带来了无与伦比的灵活性。从简单的手动控制到复杂的多流处理每一步都需要仔细考量性能、兼容性和用户体验。最好的学习方式就是动手实践从一个功能点开始逐步迭代最终打造出完全符合你想象的那个“相机”。

相关新闻

蚁群算法在物流配送路径规划中的实践与优化

蚁群算法在物流配送路径规划中的实践与优化

1. 蚁群算法在配送路径规划中的核心价值 第一次接触蚁群算法是在2015年参与一个物流优化项目时。当时客户要求我们在3小时内完成200个配送点的路径规划,传统算法要么耗时过长,要么结果不理想。直到尝试了蚁群算法(Ant Colony Optimization, A…

2026/8/3 13:58:48 阅读更多 →
【北京】担心云客服系统数据不安全?企业级加密与本地化部署方案深度解析

【北京】担心云客服系统数据不安全?企业级加密与本地化部署方案深度解析

摘要: 云客服系统在带来弹性扩容和低成本接入的同时,数据安全问题始终是企业决策者最核心的顾虑——客户通话录音、工单记录和业务数据一旦泄露,面临的不只是商业损失,更是《个人信息保护法》下的合规处罚。本文从数据安全的技术架…

2026/8/3 13:58:48 阅读更多 →
ODYSSEY平台实战FAQ:从环境配置到性能调优的避坑指南

ODYSSEY平台实战FAQ:从环境配置到性能调优的避坑指南

1. 项目概述:为什么需要一份“常见问题解答”?如果你正在使用或考虑使用ODYSSEY,那么这份“常见问题解答”就是为你准备的。无论是初次上手时的手足无措,还是在深度使用中遇到的“灵异”故障,我们都经历过。技术文档往…

2026/8/3 13:58:48 阅读更多 →

最新新闻

Python招聘数据分析与可视化实战指南

Python招聘数据分析与可视化实战指南

1. 项目概述:Python招聘数据分析与可视化的价值 招聘数据分析与可视化是当前企业HR和求职者都高度关注的热点领域。通过Python技术栈处理招聘数据,我们可以从海量职位信息中挖掘出行业薪资趋势、技能需求变化、地域分布特征等关键洞察。这个项目特别适合…

2026/8/3 14:28:04 阅读更多 →
Windows HEIC缩略图终极指南:三步让iPhone照片在Windows中完美预览

Windows HEIC缩略图终极指南:三步让iPhone照片在Windows中完美预览

Windows HEIC缩略图终极指南:三步让iPhone照片在Windows中完美预览 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 你…

2026/8/3 14:28:04 阅读更多 →
Appium移动端自动化测试实战:从环境配置到项目落地全解析

Appium移动端自动化测试实战:从环境配置到项目落地全解析

1. 项目概述:为什么是Appium?如果你是一名移动端测试工程师,或者是一名希望将重复的App测试工作自动化的开发者,那么“Appium”这个名字你一定不陌生。它几乎是目前移动端自动化测试领域的“瑞士军刀”,尤其是在Androi…

2026/8/3 14:28:04 阅读更多 →
游戏SDK接入工程实践与避坑指南

游戏SDK接入工程实践与避坑指南

1. 游戏SDK接入的"装修清单"思维第一次接触游戏SDK接入时,我被各种配置文件和接口文档搞得晕头转向。直到有天盯着新房装修清单,突然意识到——SDK接入不就是给游戏"装修"吗?每个环节都需要精心规划,就像装修…

2026/8/3 14:28:04 阅读更多 →
IMX219摄像头从硬件连接到AI应用:树莓派视觉开发全攻略

IMX219摄像头从硬件连接到AI应用:树莓派视觉开发全攻略

1. 项目概述:IMX219摄像头与它的舞台如果你玩过树莓派,或者捣鼓过一些需要“眼睛”的嵌入式项目,那你大概率听说过IMX219这颗传感器。它不是什么新鲜玩意儿,但绝对是小型化、低成本视觉方案里的“常青树”。从早期的树莓派摄像头模…

2026/8/3 14:28:04 阅读更多 →
盗版CorelDRAW的隐性代价:从技术风险到职业发展的全面解析

盗版CorelDRAW的隐性代价:从技术风险到职业发展的全面解析

1. 项目概述:一次关于软件版权的深度探讨最近在几个设计交流群里,又看到有人在求所谓的“绿色版”、“破解版”CorelDRAW安装包,甚至还有人分享“完美激活”的教程。这让我想起多年前自己刚入行时,也曾为了省下几千块钱&#xff0…

2026/8/3 14:27:04 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →