打开本机摄像头全指南:浏览器、桌面端与移动端实战
简介这份资源围绕“打开本机摄像头”这一常见开发需求面向希望入门视频捕捉与图像处理的编程学习者尤其适合刚接触计算机视觉或桌面端开发的初学者。包内共26个文件以cs源码文件为主辅以exe可执行程序、resx资源文件、csproj工程配置及pdb调试符号等压缩包约42KB整体是一个可直接编译运行的C#视频监控示例工程。内容涉及摄像头硬件接口调用、视频流读取与画面展示等核心环节并可与OpenCV、WebRTC等主流方案对照理解。目前已有1597人学习下载。通过该工程读者可掌握摄像头初始化、帧图像获取与实时预览的基本流程理解视频监控类程序的目录组织与模块划分为后续拓展拍照、网络传输或流媒体播放等功能打下实践基础。1. 打开本机摄像头从一行调用到一条可用的采集链路很多人第一次在项目里写「打开本机摄像头」脑子里想的是调一个 API、弹一个预览框五分钟收工。真上手才发现浏览器要权限、桌面端要驱动、移动端要生命周期同一句需求在三种宿主里是三套完全不同的东西。更麻烦的是摄像头一旦被别的进程占用报错信息往往只有一句「设备不可用」你连是权限问题、驱动问题还是被抢占了都分不清活脱脱一个黑匣子。这篇笔记就围绕「打开本机摄像头」这一件事把浏览器 Web 端、桌面端、移动端三条常见路径拆开讲清楚先讲清各自的能力边界和选型理由再落到能直接抄的最小代码最后把权限、分辨率、帧率、设备切换、资源释放这些必调参数和踩坑点摊开。目标读者是需要在产品里集成实时预览、拍照、扫码或视频采集的开发者新手能照着跑通熟手能对着参数表和排查清单校准自己的实现。2. 浏览器端打开摄像头getUserMedia 的最小可用链路浏览器是「打开本机摄像头」最普遍的入口核心 API 就是navigator.mediaDevices.getUserMedia。它返回一个MediaStream你把它塞给video的srcObject就能看到画面。听起来简单但真正决定成败的是约束对象constraints怎么配、权限在什么时机申请、流什么时候关。2.1 先判断能力再申请权限不要一上来就调getUserMedia先做能力探测。原因很实际在非安全上下文非 HTTPS、非 localhost里navigator.mediaDevices直接是undefined你调它只会得到一个TypeError而不是一个友好的权限错误。先判断再申请能把「环境不支持」和「用户拒绝」两类问题分开排查时省一半时间。// 能力探测区分「环境不支持」和「用户拒绝」两类失败 async function checkCameraSupport() { // 非安全上下文下 mediaDevices 为 undefined必须先判断 if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) { throw new Error(当前环境不支持摄像头采集请检查是否 HTTPS 或 localhost); } // 枚举设备可拿到设备数量但注意未授权时 label 为空字符串 const devices await navigator.mediaDevices.enumerateDevices(); const cameras devices.filter(d d.kind videoinput); return cameras.length 0; }这段代码的逻辑是先确认 API 存在再枚举输入设备确认「有没有摄像头」。参数上没什么可调的但有个关键行为要记住——在用户授权之前enumerateDevices返回的设备label是空字符串deviceId也可能被截断。所以你不能靠枚举结果去给用户展示「前置/后置摄像头」的名字那要等授权之后再做一次枚举才准。2.2 约束对象怎么配分辨率、帧率与 facingModegetUserMedia的第一个参数是约束对象它决定了你拿到什么样的流。这里是最容易翻车的地方你写width: 1920不代表真能拿到 1920浏览器会尽量满足满足不了就给你一个接近的值而且不报错。所以约束要分「理想值」和「必须值」。// 采集约束ideal 是尽量满足exact 是必须满足否则报错 const constraints { audio: false, // 只开视频音频单独处理避免不必要的权限弹窗 video: { width: { ideal: 1280 }, // 理想宽度浏览器可降级 height: { ideal: 720 }, // 理想高度 frameRate: { ideal: 30, max: 60 }, // 理想 30 帧上限 60 facingMode: user // user 前置 / environment 后置移动端关键 } }; async function openCamera(videoEl) { const stream await navigator.mediaDevices.getUserMedia(constraints); videoEl.srcObject stream; videoEl.setAttribute(playsinline, ); // iOS Safari 必须否则全屏播放 await videoEl.play(); return stream; }逻辑说明audio: false是有意为之只申请视频权限能减少一次权限弹窗也避免麦克风被意外采集。ideal和exact的区别是核心——用ideal浏览器会尽力满足并允许降级用exact则满足不了直接抛OverconstrainedError。我一般对分辨率用ideal对facingMode在需要强制后置时才用exact。playsinline这个属性在 iOS Safari 上是血泪经验不加的话视频会强制全屏页面布局全乱。参数怎么改做扫码就调高分辨率ideal: 1920并锁定后置做视频通话用 640×480、24 帧就够省带宽做拍照预览可以要 1280×720。帧率别盲目拉满max: 60在低端设备上会导致掉帧和发热ideal: 30是稳妥起点。2.3 拿到流之后设备切换与资源释放流拿到手不是终点。用户可能要在前后摄像头之间切换页面切走或组件卸载时你必须主动关掉轨道否则摄像头指示灯一直亮着用户会以为你在偷拍——这是最影响信任的细节。// 切换摄像头先停旧流再开新流避免设备被占用 async function switchCamera(videoEl, currentStream, deviceId) { // 停止所有轨道释放设备占用 currentStream.getTracks().forEach(track track.stop()); const newStream await navigator.mediaDevices.getUserMedia({ audio: false, video: { deviceId: { exact: deviceId } } // 指定设备必须精确匹配 }); videoEl.srcObject newStream; await videoEl.play(); return newStream; } // 页面卸载或组件销毁时务必调用 function releaseCamera(stream) { if (!stream) return; stream.getTracks().forEach(track track.stop()); }逻辑说明切换设备时用deviceId: { exact: ... }因为设备 ID 是精确的用ideal反而可能匹配到别的摄像头。track.stop()是释放设备的唯一正确方式只把srcObject置空不会释放硬件。参数上deviceId要从授权后的enumerateDevices里取别缓存授权前的值。注意getUserMedia必须在用户手势点击等触发的调用链里发起否则部分浏览器会直接拒绝。别在页面加载时自动调用。3. 桌面端打开摄像头从 OpenCV 到系统原生采集浏览器之外「打开本机摄像头」在桌面端最常见的两种做法是用 OpenCV 这类跨平台库快速拿到帧或者用系统原生 API 做更底层的控制。选哪个取决于你要的是「快速出画面」还是「精细控制曝光、对焦、多路同步」。3.1 OpenCV 打开摄像头的最小代码与参数如果你只是要读帧做图像处理OpenCV 的VideoCapture是最省事的路径。它内部封装了各平台的采集后端一行VideoCapture(0)就能打开默认摄像头。import cv2 # 0 表示默认摄像头也可传设备路径或索引 cap cv2.VideoCapture(0) # 设置采集参数宽、高、帧率注意这些是「请求值」不一定生效 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) cap.set(cv2.CAP_PROP_FPS, 30) if not cap.isOpened(): raise RuntimeError(摄像头打开失败检查设备索引或被占用情况) while True: ret, frame cap.read() # ret 为 False 表示读帧失败 if not ret: break cv2.imshow(preview, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() # 释放设备 cv2.destroyAllWindows()逻辑说明VideoCapture(0)的索引对应系统里的摄像头顺序多摄像头时依次试 0、1、2。cap.set设置的分辨率和帧率是请求值实际生效值要用cap.get读回来确认——这是很多人忽略的一步你以为设了 1080p实际可能还是 640×480。cap.read()返回的ret必须判断设备被拔掉或占用时它会变False不判断就会拿到空帧继续处理后面全是玄学 bug。参数怎么改CAP_PROP_FRAME_WIDTH/HEIGHT按需设但要注意某些后端只支持特定分辨率组合CAP_PROP_FPS在 USB 摄像头上经常不生效因为带宽和曝光时间会限制实际帧率。如果打开失败先换索引再检查是不是被别的程序占用。3.2 系统原生采集什么时候值得上OpenCV 够用但它对曝光、白平衡、对焦这些底层参数的控制很有限跨平台行为也不一致。如果你要做工业检测、多路摄像头硬同步、或者需要精确控制曝光时间就得下沉到系统原生 API。常见做法是Windows 上用 Media FoundationLinux 上用 V4L2macOS 上用 AVFoundation。以 Linux 的 V4L2 为例你可以直接用命令行先确认设备能力和支持的格式再决定代码怎么写# 列出所有视频设备 ls /dev/video* # 查看某设备支持的格式、分辨率、帧率 v4l2-ctl --device/dev/video0 --list-formats-ext # 查看并设置曝光等参数 v4l2-ctl --device/dev/video0 --list-ctrls v4l2-ctl --device/dev/video0 --set-ctrlexposure_absolute100逻辑说明--list-formats-ext会列出设备真正支持的像素格式如 MJPG、YUYV和每种格式下的分辨率帧率组合。这一步很关键——很多「打开摄像头失败」其实是请求了设备不支持的格式。MJPG 格式通常能支持更高分辨率因为它是压缩传输省 USB 带宽YUYV 是未压缩高分辨率下帧率会掉得厉害。参数怎么改曝光用exposure_absolute自动曝光开关是exposure_auto白平衡用white_balance_temperature。这些控制项名字因驱动而异先用--list-ctrls看设备实际暴露了哪些别照搬。3.3 桌面端选型对照方案上手成本参数控制粒度跨平台一致性适用场景OpenCV VideoCapture低粗中快速原型、图像处理系统原生 API高细低工业检测、多路同步浏览器 getUserMedia低中高Web 应用、跨端预览选型逻辑很简单要快、要跨平台用 OpenCV 或浏览器要精细控制、要稳定帧同步下沉到原生。别为了「看起来专业」一上来就写原生多数业务用不上那些控制项。4. 移动端打开摄像头权限、生命周期与前后台切换移动端是「打开本机摄像头」坑最密集的地方。Android 和 iOS 各有自己的权限模型应用切到后台再回来摄像头可能已经被系统回收你不重新申请就会拿到黑屏。这一章按「权限申请 → 打开预览 → 生命周期处理」的顺序讲。4.1 权限申请运行时权限与拒绝后的降级移动端摄像头权限是运行时权限必须在代码里显式申请而且用户拒绝一次之后再次申请的行为在不同系统版本上不一样。核心原则是申请前先检查拒绝后给引导别死循环弹窗。// Android检查并申请摄像头权限示意使用 Activity Result API private val requestCamera registerForActivityResult( ActivityResultContracts.RequestPermission() ) { granted - if (granted) { openCameraPreview() // 授权成功打开预览 } else { showPermissionGuide() // 拒绝后引导去设置页不要反复弹窗 } } fun ensureCameraPermission() { when { // 已授权直接打开 ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) PackageManager.PERMISSION_GRANTED - openCameraPreview() // 未授权则申请 else - requestCamera.launch(Manifest.permission.CAMERA) } }逻辑说明checkSelfPermission先判断避免重复申请。用户拒绝后不要立刻再弹而是走showPermissionGuide引导到系统设置。参数上Android 需要在清单里声明android.permission.CAMERAAndroid 6.0 以上必须运行时申请。iOS 则需要在Info.plist里配置相机用途描述否则申请时直接崩溃——这是 iOS 上最常见的翻车点。4.2 打开预览与前后台生命周期移动端打开预览后最大的坑是生命周期。应用切到后台系统会回收摄像头资源切回前台你必须重新初始化否则预览是黑的而且不报错。// 生命周期处理前台恢复时重开后台时释放 override fun onResume() { super.onResume() // 回到前台重新打开摄像头 if (hasPermission()) openCameraPreview() } override fun onPause() { super.onPause() // 切到后台释放摄像头避免被系统强杀或占用 releaseCamera() }逻辑说明onResume里重开、onPause里释放是移动端摄像头管理的标准节奏。参数上没什么可调但要注意释放要彻底——停掉预览、关闭采集会话、释放设备句柄只停预览不释放会话切回来可能还是黑屏。iOS 对应的是viewWillAppear/viewWillDisappear逻辑一致。4.3 移动端常见参数与朝向处理移动端摄像头有前后置之分还有屏幕旋转导致的画面方向问题。facingMode在 Web 端用原生端则用各自的摄像头选择 API。方向问题通常靠读取设备方向再旋转预览来解决别指望采集出来的帧方向自动正确。参数/问题处理方式注意点前后置切换原生摄像头选择 API切换前先释放当前会话画面方向按设备方向旋转预览采集帧方向与预览可能不一致分辨率按业务选预览可低、拍照要高高分辨率预览会明显发热后台回收onPause 释放、onResume 重开不重开会黑屏且无报错5. 打开本机摄像头的避坑清单五类高频翻车这一章把前面散落的坑集中起来按「现象 → 原因 → 解决」写清楚。这些都是我在实际项目里踩过或见别人踩过的不是理论推演。现象一浏览器里getUserMedia报NotAllowedError但用户说没点拒绝。原因多半是非安全上下文或者调用不在用户手势的调用链里。部分浏览器对页面加载时自动调用会直接拒绝。 解决确认页面是 HTTPS 或 localhost把调用放到按钮点击的回调里用navigator.permissions.query({name:camera})查当前权限状态区分「未申请」和「已拒绝」。现象二桌面端VideoCapture(0)打开成功但读帧一直是空。原因设备被别的进程占用或者请求的分辨率/格式设备不支持导致内部协商失败但isOpened仍返回真。 解决先用v4l2-ctl --list-formats-extLinux确认支持的格式换索引试关掉可能占用摄像头的其他程序读帧时判断ret别假设一定成功。现象三移动端切到后台再回来预览黑屏且无任何报错。原因系统回收了摄像头资源但代码没有在回到前台时重新初始化。 解决在onResume/viewWillAppear里重新打开摄像头onPause/viewWillDisappear里彻底释放。别依赖「切回来资源还在」。现象四iOS 上申请权限直接崩溃。原因Info.plist里没有配置相机用途描述字符串。 解决补上相机和麦克风的用途描述描述要写清楚用途不能留空。这是硬性要求缺了必崩。现象五视频预览方向不对或者画面被拉伸变形。原因采集帧的宽高比和预览容器的宽高比不一致或者移动端没处理设备方向。 解决预览容器按采集宽高比设置用object-fit: cover或等比缩放移动端读取设备方向并旋转预览别用固定宽高去套所有设备。注意摄像头是敏感权限任何「打开」都要有明确的用户触发和明确的释放时机。用户对摄像头指示灯的敏感度远高于你的想象资源没释放会直接损害信任。6. 把采集链路做稳从能开到可控的三个进阶技巧能打开摄像头只是及格线真正决定体验的是「开得稳、切得快、关得净」。这里给三个我常用的进阶做法都是围绕可控性来的。第一个技巧是用能力协商代替硬编码约束。不要写死分辨率而是先读设备能力再从中挑一个最接近业务需求的组合。浏览器端可以先用一次宽松约束拿到流读track.getSettings()看实际生效的宽高帧率再决定要不要用applyConstraints调整。桌面端则先--list-formats-ext或cap.get读回实际值。这样做的价值是同一份代码在不同设备上都能拿到「该设备能给的最好结果」而不是在低端设备上直接失败。// 先宽松打开读回实际能力再按需收紧 const stream await navigator.mediaDevices.getUserMedia({ video: true, audio: false }); const track stream.getVideoTracks()[0]; const settings track.getSettings(); console.log(实际生效:, settings.width, settings.height, settings.frameRate); // 如果业务需要更高分辨率且设备支持再申请收紧 await track.applyConstraints({ width: { ideal: 1920 }, height: { ideal: 1080 } });逻辑说明getSettings()返回的是实际生效值applyConstraints可以在不重新申请权限的前提下调整约束。参数上applyConstraints同样遵循ideal/exact规则用ideal更安全。这个模式的好处是把「设备能给什么」和「业务要什么」解耦失败时也有降级路径。第二个技巧是给采集链路加健康检查。摄像头流不是拿到就一劳永逸USB 松动、驱动异常、系统休眠都会让流悄悄断掉。我一般会监听track的ended事件或者定时检查readyState一旦发现流断了就自动重连并给用户一个明确提示而不是让画面卡在那里。// 监听流中断自动重连 function watchStream(track, onLost) { track.addEventListener(ended, () { console.warn(摄像头流已中断); onLost(); // 触发重连逻辑 }); }逻辑说明ended事件在设备被拔出或流被外部停止时触发。参数上没有可调的关键是重连要有退避策略别一断就疯狂重试那样在设备真被占用时会刷爆日志。我一般用 1 秒、2 秒、4 秒的退避重试三次失败后提示用户手动检查。第三个技巧是把释放做成幂等操作。释放摄像头最怕重复调用或漏调用。我的习惯是封装一个release函数内部判断流是否存在、轨道是否已停止重复调用不报错漏调用也能在组件销毁的统一入口兜底。这样即使业务代码里有分支提前返回也不会漏掉释放。技巧解决的问题关键点能力协商硬编码约束在低端设备失败先读回实际值再收紧健康检查流悄悄断掉无感知监听 ended退避重连幂等释放重复释放报错、漏释放占设备判断状态统一入口兜底这三个技巧不复杂但能把「打开本机摄像头」从「能跑」推到「敢上线」。我自己最早做视频采集时就是没做健康检查和幂等释放结果用户反馈「偶尔黑屏」「摄像头灯一直亮」排查了半天才发现是流断了没重连、组件卸载没释放。后来把这两件事补上同类问题基本绝迹。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

C# 集成 YOLOv8+OpenVINO+ByteTrack 多目标跟踪实战

C# 集成 YOLOv8+OpenVINO+ByteTrack 多目标跟踪实战

简介:本资源是面向C#开发者与计算机视觉入门者的实时目标检测与追踪示例工程,聚焦在C#环境下集成OpenVINO推理引擎、YOLOv8检测模型与ByteTrack多目标追踪算法,可用于智能安防、无人机监控等场景的原型验证与学习实践。压缩包共378个文件&…

2026/10/11 23:53:56 阅读更多 →
SQL优化完整链路:从慢SQL定位到执行计划与索引原理

SQL优化完整链路:从慢SQL定位到执行计划与索引原理

写SQL优化已经十多年了,说句实话,每次听到“我这条SQL加了索引还是很慢”这种说法,我就知道问题大概率不在索引本身,而在更底层的执行计划、数据分布和写法逻辑上。绝大多数慢SQL,都不是靠“加个索引”就能解决的&…

2026/10/11 23:53:56 阅读更多 →
Android运动健康App架构解析:从传感器采集到状态持久化

Android运动健康App架构解析:从传感器采集到状态持久化

简介:这是一套功能完整的Android健身类APP源码,面向移动开发初学者与进阶者,适用于学习健身应用架构设计、用户健康管理模块实现及多媒体交互开发。项目整体风格对标KEEP、薄荷健康等主流产品,涵盖用户注册登录、课程训练计划、运…

2026/10/11 23:53:56 阅读更多 →

最新新闻

基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

基于SVDD算法的数据分类MATLAB仿真:原理、代码与避坑指南

简介:本资源为基于SVDD算法的数据分类MATLAB仿真程序包,面向机器学习初学者、模式识别课程学习者及需要复现单类分类实验的科研人员,帮助理解支持向量数据描述在异常检测与数据分类中的建模流程。包内共16个文件,以12个m脚本为核心…

2026/10/12 0:45:23 阅读更多 →
【厦门大学主办、IEEE出版】第六届人工智能、机器人和通信国际会议(ICAIRC 2026)

【厦门大学主办、IEEE出版】第六届人工智能、机器人和通信国际会议(ICAIRC 2026)

第六届人工智能、机器人与通信国际会议(ICAIRC 2026)将于2026年11月13日至15日在中国厦门举办。本次会议旨在搭建一个高水平学术交流平台,汇聚全球人工智能、机器人及通信领域的专家学者、工程技术人员与研发人员,分享前沿研究成果…

2026/10/12 0:45:23 阅读更多 →
塔吊下方站人检测数据集:VOC标注与YOLOv8实战指南

塔吊下方站人检测数据集:VOC标注与YOLOv8实战指南

简介:这份资源面向从事工地安全监控、目标检测算法开发的研究者与工程师,提供塔吊下方站人检测任务的图像数据集,用于训练和验证识别塔吊作业区域人员的视觉模型,降低误入危险区域引发事故的风险。压缩包共2000个文件,…

2026/10/12 0:45:23 阅读更多 →
如何把“无可挑剔”变成可执行的工作清单?标准定义与流程复盘实战

如何把“无可挑剔”变成可执行的工作清单?标准定义与流程复盘实战

“impeccable”这个词,我盯着看了很久。它不像是那种一眼就能猜出功能的标题,恰恰是这种“不直白”,让我当时决定把这个项目做下去。一年多时间,从零开始摸索到产出稳定,今天想把这个过程中关于“如何把一件事做到无可…

2026/10/12 0:45:23 阅读更多 →
Web 3D 实例化网格(InstancedMesh)几何合批:用单次 Draw Call 渲染森林与千级手办

Web 3D 实例化网格(InstancedMesh)几何合批:用单次 Draw Call 渲染森林与千级手办

在构建大型三维元宇宙展厅、大促虚拟 3D 商城街区、以及自然生态数字孪生(如漫山遍野的植被树木、飘落的花瓣)时,前端 3D 工程师最先撞上的“性能叹息之墙”,往往不是 GPU 的多边形光栅化能力,而是CPU 侧的绘制调用过载…

2026/10/12 0:45:23 阅读更多 →
DeepLog日志异常检测:LSTM时序建模实战指南

DeepLog日志异常检测:LSTM时序建模实战指南

简介:本资源是一套基于LSTM神经网络的日志异常检测项目源码,面向AI运维、日志分析与系统可靠性方向的中高级开发者及研究生,聚焦解决IT系统运行中关键故障的早期识别问题。项目以Deeplog框架为基底,完整实现日志序列建模、事件特征…

2026/10/12 0:44:22 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →