ONVIF Java SDK实战:摄像头统一接入、RTSP取流与PTZ控制

简介:这份资源是一套基于Java的ONVIF协议开发SDK,面向需要对接网络摄像头、实现设备发现、鉴权与媒体流控制的开发者。包内共1157个文件,主体为1147个Java源码文件,另有少量jar依赖库(如commons-codec、javaWsDiscovery)以及Gradle构建配置、运行脚本和properties配置文件,压缩包仅2.32MB,结构清晰,可快速导入工程。SDK覆盖ONVIF协议的主要功能,Demo着重演示了设备发现、鉴权与基础媒体操作;若需实现更复杂的自定义业务,可通过阅读源码理解UDP、HTTP与XML的交互机制。目前已有657人学习下载,适合具备一定Java基础、希望从代码层面掌握ONVIF协议实现细节的开发者作为参考起点,也可作为二次开发的底层依赖。

1. ONVIF JAVA SDK:让网络摄像头接入不再靠抓包猜协议

搞过摄像头对接的人都有同感:海康、大华、宇视各家 SDK 长得完全不一样,换个品牌就得重新读一遍文档,底层通信协议还得靠抓包一点点猜,一个项目下来大半时间耗在联调上。ONVIF 协议就是为解决这个局面来的,它把设备发现、RTSP 取流、云台控制、录像回放这些操作统一成一套标准接口,而这份 ONVIF JAVA SDK 资源把协议层封装成了可直接调用的 Java 库,省去自己写 SOAP 报文和 WS-Discovery 的功夫。适合两类人:一是做综合安防平台、需要对接多品牌摄像头的后端开发,二是刚入门摄像头开发、想绕开协议细节快速跑通取流和云台控制的学生或初级工程师。下面我从协议基础讲到 SDK 的实际用法,最后给出几个容易翻车的坑。

2. 协议基础与选型理由:为什么 ONVIF 能统一设备接入

2.1 ONVIF 到底规范了哪些事

ONVIF(Open Network Video Interface Forum)不是一个单一的协议,而是一组基于 Web Services 的接口规范集合,核心通信载体是 SOAP over HTTP/HTTPS。它定义了设备发现(WS-Discovery)、设备信息获取(GetDeviceInformation)、媒体配置(Media Service)、PTZ 控制(PTZ Service)、录像管理(Recording Search / Replay)等若干服务模块。每个服务模块对应一组 WSDL 定义的接口,地址通常是http://设备IP:端口/onvif/device_service或/onvif/media_service这类路径。

这份 SDK 的核心价值在于把 WSDL 生成的繁琐过程做了收敛。如果用纯 Java 写 ONVIF 客户端,你需要自己引入 CXF 或 Axis2 生成客户端桩代码,再手动处理 SOAP 头里的安全性认证(WS-Security UsernameToken),还要自己解析GetProfiles返回的复杂嵌套 XML。SDK 把这些封装成了DeviceClient、MediaClient、PTZClient这样的高等级对象,调用方式从「构造 SOAP 请求 → 序列化 → HTTP 发送 → 解析响应」变成了「new 一个 Client → 调方法 → 拿结果」。

2.2 为什么选 Java 而不是 Python 或 Go

做安防平台后端,Java 的生态优势明显。大部分摄像头厂商的管理平台服务端是 Java 技术栈,Spring Boot 项目里接入 ONVIF 只需引入一个 jar 包;另外 ONVIF 是 SOAP 协议,Java 有成熟的 WS 框架支撑,遇到需要自定义 SOAP Header 的场景,手工拼接 XML 字符串也比动态语言容易控制。Go 虽然并发性能好,但 ONVIF 社区库质量参差不齐,很多只实现了设备发现和取流,PTZ 和录像回放支持不全,最后还是要自己补协议细节。

2.3 SDK 的目录结构与核心类

模块对应类主要方法
设备发现DiscoveryClientsearch()/search(SearchCriteria)
设备信息DeviceClientgetDeviceInfo()/getCapabilities()
媒体配置MediaClientgetProfiles()/getStreamUri()/getSnapshotUri()
PTZ 控制PTZClientcontinuousMove()/stop()/absoluteMove()/relativeMove()
录像回放ReplayClientgetReplayUri()/findRecordings()

从类名能看出封装粒度:每个 Client 对应一个 ONVIF 服务模块,方法名基本就是 WSDL 接口名去掉前缀。如果你之前用过厂商私有 SDK,会发现这套命名习惯非常接近,迁移成本主要在熟悉参数结构上,而不是接口调用方式。

3. 快速跑通设备发现与取流:从零开始的一个小时实践

3.1 环境准备与依赖引入

这份 SDK 基于 JDK 1.8 编译,依赖较少,核心库只用了几个 WS 相关的 jar。在 Maven 项目里直接把 SDK 打入本地仓库或安装到私有 Nexus,然后引入即可。

<dependency> <groupId>com.onvif</groupId> <artifactId>onvif-java-sdk</artifactId> <version>1.0.0</version> </dependency>

如果项目不是 Maven 管理,直接把 SDK 解压后的 jar 放到 lib 目录,注意带上它依赖的几个 WS 库。这里有个常见误区:SDK 不是 fat jar,运行时缺依赖会报ClassNotFoundException,尤其是org.apache.cxf包下的类。排查方法很简单,报错信息里看是哪个类找不到,再去 SDK 的 lib 依赖清单里找对应 jar。

设备发现依赖 UDP 组播,代码里需要指定网卡,否则多网卡环境下可能发现不了设备或出现跨 VLAN 误发现的情况。默认探测地址是239.255.255.250:3702,这是 WS-Discovery 的标准组播地址。

3.2 写一个设备发现程序

import com.onvif.discovery.DiscoveryClient; import com.onvif.discovery.model.DeviceInfo; public class CameraDiscovery { public static void main(String[] args) { DiscoveryClient discovery = new DiscoveryClient(); // 设置超时时间,单位毫秒,建议至少给 3000ms discovery.setTimeout(5000); List<DeviceInfo> devices = discovery.search(); for (DeviceInfo device : devices) { System.out.println("设备地址: " + device.getIpAddress()); System.out.println("ONVIF 端口: " + device.getPort()); System.out.println("XAddr: " + device.getXAddr()); } } }

这段代码是典型的「三步走」:创建 Client、设置超时、调用 search。DeviceInfo里的XAddr是后续所有服务调用的基础地址,SDK 内部会根据能力集去拼各个服务模块的完整地址。注意search()返回的是同一网段内所有支持 ONVIF 的设备,包括 NVR 下挂的摄像头通道,它们的 IP 可能是 NVR 虚拟出来的,直接用这个 IP 去连会连不上,需要看XAddr里的实际地址做二次寻址。

如果发现不了设备,先手动用 ONVIF 客户端工具扫一下同一网段,确认设备确实开了 ONVIF 开关。很多摄像头默认关闭 ONVIF,需要在 Web 管理页面里手动启用,这跟私有 SDK 不一样——私有 SDK 一般开着服务,但 ONVIF 是个可选项。

3.3 获取媒体 Profile 与 RTSP 取流地址

拿到设备地址和端口后,核心操作是拿 RTSP 取流地址。ONVIF 的取流流程是:GetProfiles拿所有视频编码配置 → 选中一个 Profile →GetStreamUri拿该 Profile 下的 RTSP URL。

import com.onvif.media.MediaClient; import com.onvif.media.model.Profile; import com.onvif.media.model.StreamUri; public class GetStream { public static void main(String[] args) { String xaddr = "http://192.168.1.64:8080/onvif/device_service"; String username = "admin"; String password = "admin123"; MediaClient mediaClient = new MediaClient(xaddr, username, password); List<Profile> profiles = mediaClient.getProfiles(); System.out.println("该设备共有 " + profiles.size() + " 个 Profile"); // 通常第一个 Profile 是主码流,第二个是子码流 Profile mainProfile = profiles.get(0); StreamUri streamUri = mediaClient.getStreamUri(mainProfile.getToken()); System.out.println("RTSP 地址: " + streamUri.getUri()); } }

getStreamUri方法传的参数是 Profile Token,不是 Profile 对象本身。Token 是设备端生成的字符串标识,形如"P_2048_1920"这种,不同厂商命名规则千奇百怪。常见做法是拿第一个 Profile 直接试,因为大多数设备的 Profile 列表顺序是主码流在前,但这不绝对。稳妥做法是先遍历 profiles,根据getEncoding()(H.264/H.265)和分辨率字段判断哪个是主码流。

RTSP 地址拿回来后,直接用 VLC 或 FFmpeg 测试能否播放。很多坑在这一步显现:有的设备取流地址里带?token=xxx参数,SDK 返回的 URL 已经拼接完整;有的设备地址里的 IP 是内网 IP,跨网段播放时要手动替换成可路由的 IP。别小看这一步,生产环境里摄像头和服务器不在同一 VLAN 时,这几乎是必踩的坑。

4. PTZ 云台控制实战:坐标系、速度参数与调坑记录

4.1 连续移动与绝对定位的区别

云台控制是安防项目里最容易出幺蛾子的模块,因为不同厂商对 PTZ 参数的理解差异很大。ONVIF 标准里定义了三种移动方式:ContinuousMove(连续移动)、AbsoluteMove(绝对移动)、RelativeMove(相对移动)。ContinuousMove 适合手动操控,传给云台一个速度向量,设备按这个速度一直转,直到收到Stop命令;AbsoluteMove 适合预置位定位,传目标坐标和速度,云台直接转到指定位置。

import com.onvif.ptz.PTZClient; import com.onvif.ptz.model.PTZSpeed; import com.onvif.ptz.model.PTZVector; public class PTZControl { public static void main(String[] args) { PTZClient ptzClient = new PTZClient("http://192.168.1.64:8080/onvif/ptz_service", "admin", "admin123"); String profileToken = "P_2048_1920"; // 连续移动:向右转,速度 0.5(范围 -1.0 ~ 1.0) PTZSpeed speed = new PTZSpeed(); speed.setPan(0.5); speed.setTilt(0.0); speed.setZoom(0.0); ptzClient.continuousMove(profileToken, speed); // 等 2 秒后停止 Thread.sleep(2000); ptzClient.stop(profileToken); // 绝对移动:转到水平 50 度、垂直 30 度的位置 PTZVector position = new PTZVector(); position.setPan(50.0); position.setTilt(30.0); PTZSpeed moveSpeed = new PTZSpeed(); moveSpeed.setPan(1.0); moveSpeed.setTilt(1.0); ptzClient.absoluteMove(profileToken, position, moveSpeed); } }

速度参数的范围是 -1.0 到 1.0,正负代表方向,绝对值大小代表速度比例。这个和厂商私有 SDK 的百分比参数长得像但不一样,私有 SDK 有的用 0-255,有的用 0-100,直接套用会翻车。绝对移动的坐标单位是度,但不同设备的坐标范围不同,有的水平范围是 [-180, 180],有的是 [0, 360],需要先用GetConfigurationOptions拉一下设备支持的坐标系范围。

4.2 预置位设置与调用

预置位功能在 ONVIF 里叫SetPreset/GotoPreset/RemovePreset,本质是把当前云台位置保存成一个编号,之后直接调编号就能恢复到这个位置。这个功能在巡检、跟踪场景里用得非常多。

// 设置预置位,返回预置位 token String presetToken = ptzClient.setPreset(profileToken, "入口方位"); System.out.println("预置位 token: " + presetToken); // 调用预置位 ptzClient.gotoPreset(profileToken, presetToken, new PTZSpeed());

注意setPreset的第二个参数是预置位名称,但如果你传中文名称,部分设备的兼容性很差,轻则乱码,重则直接报错。我一般习惯传英文或纯数字标识,显示名称另存到自己的业务表里。gotoPreset的第三个参数是速度,如果传 null 或不设置,设备会用默认速度移动,某些设备默认速度极慢,最好显式指定。

4.3 PTZ 调试的避坑记录

现象 1:continuousMove调用后云台完全不动,但方法没报错。 原因:Profile Token 拿错了。设备有多个 Profile,PTZ 服务是和特定 Profile 绑定的,如果该 Profile 没有启用 PTZ(比如是虚拟通道或只读通道),指令会被静默丢弃。 解决:遍历所有 Profile,逐个尝试发送移动命令;或者用GetConfigurations检查哪个 Profile 关联了 PTZ 配置。

现象 2:绝对移动坐标偏差巨大,云台转到完全不对的位置。 原因:设备坐标系的原点和范围设置不同。有的设备水平范围是 [0, 360],原点在正北;有的是 [-180, 180],原点和正北差 90 度。 解决:先调GetConfigurationOptions拉取设备实际支持的范围,再用是否需要设置CoordinateSystem字段做适配。这个字段在不同厂商固件下的行为不一致,有的设备忽略它,有的设备强制要求它。

现象 3:多台设备用同一套代码,一台正常一台乱转。 原因:云台速度曲线不一致。某些半球摄像机对速度参数做了非线性映射,传 0.5 可能实际只有 0.2 的运动速度。 解决:在代码里加一个设备适配层,对速度参数做索引映射,而不是直接透传。这部分只能靠实测数据积累,没有什么标准公式。

5. 录像回放与抓图:你需要的是一次能跑通的范例

5.1 回放取流的参数构造

回放取流与实时取流不同,需要指定开始时间和结束时间。ONVIF 的GetReplayUri方法接收ReplayConfiguration参数,里面要带时间和传输协议偏好。SDK 把时间参数封装成了 Java 的Calendar类型,直接传Date也可以,内部会做转换。

import com.onvif.replay.ReplayClient; import com.onvif.replay.model.ReplayConfiguration; public class ReplayStream { public static void main(String[] args) { ReplayClient replayClient = new ReplayClient("http://192.168.1.64:8080/onvif/replay_service", "admin", "admin123"); ReplayConfiguration config = new ReplayConfiguration(); config.setProfileToken("P_2048_1920"); Calendar start = Calendar.getInstance(); start.set(2024, Calendar.NOVEMBER, 20, 10, 0, 0); config.setStartTime(start); Calendar end = Calendar.getInstance(); end.set(2024, Calendar.NOVEMBER, 20, 10, 30, 0); config.setEndTime(end); String replayUri = replayClient.getReplayUri(config); System.out.println("回放地址: " + replayUri); } }

回放地址拿到后一般用 FFmpeg 拉流处理或转存。注意回放流比实时流更耗设备资源,如果设备同时存在多个回放会话,部分低端设备会拒绝新会话或强制踢掉旧会话。生产环境需要做并发控制,限制单台设备的回放会话数。

5.2 抓图与 SnapshotUri 的坑

ONVIF 的GetSnapshotUri返回的是 JPEG 抓图地址,但不同设备对这张地址的有效期设定差异很大。有的设备返回的地址永久有效,有的设备五分钟过期,有的设备对该地址做了单次访问限制——访问一次后立刻失效。

import com.onvif.media.MediaClient; import com.onvif.media.model.SnapshotUri; public class SnapshotTest { public static void main(String[] args) { MediaClient mediaClient = new MediaClient("http://192.168.1.64:8080/onvif/media_service", "admin", "admin123"); SnapshotUri snapshot = mediaClient.getSnapshotUri("P_2048_1920"); // 这里拿到的地址可能需要携带认证信息 String snapshotUrl = snapshot.getUri(); System.out.println(snapshotUrl); } }

抓图地址有个经典问题:如果设备开启了 ONVIF 用户认证,返回的 URL 可能会包含用户名密码参数,也可能不包含,取决于设备实现。不包含的话,用浏览器直接打开会弹出登录框或者 401。SDK 内部在做 HTTP 请求时可以携带 WS-Security 认证,但getSnapshotUri返回的 URL 交给 FFmpeg 或图片加载库时,认证信息要自己拼到 URL 里——这个操作会对 URL 做一层编码,注意不要对已有的 URL 做二次编码,否则设备认不出来。

5.3 录像检索的标准化写法

录像检索在 ONVIF 里对应FindRecordings/GetRecordingSummary接口。SDK 封装了findRecordings方法,返回录音列表,每个录音包含开始时间、结束时间和存储位置。这个接口对 NVR 设备支持好,但对单台 IPC 的支持差——很多 IPC 压根没实现这个接口,调用会直接报404 Action not supported错误。遇到这种情况,只能退回用 RTSP 的play参数直接播放当天录像文件。

6. 一套提高联调效率的测试方法:拿真实设备做回归

6.1 搭一个最小复现环境

手头有实体设备时,我习惯在本地搭一套最小测试环境:一台千兆交换机、一台摄像头、一台笔记本,摄像头和笔记本接同一个交换机,笔记本固定一个 IP。交换机不需要连外网,纯局域网内联调,避免公司网络里 DHCP 分配冲突导致的地址漂移问题。

计算机上准备好两个工具:一个是 Wireshark,用于抓包看 SOAP 请求和响应;另一个是 ONVIF Device Manager(ODM),作为「标准答案」对照——ODM 能连上的设备,SDK 应该也能连上;ODM 连不上,多半是设备 ONVIF 服务没启动或端口被防火墙挡了。这个对照思路能省掉大量无意义的排查时间。

6.2 写一个自动化回归脚本

把 SDK 的每个核心功能写成 JUnit 测试用例,用真实设备跑一遍。设备接入流程、Profile 获取、实时取流、PTZ 控制、抓图、录像检索都覆盖。跑完后把输出结果和 ODM 的结果做比对。比对的重点不是看接口返回值,而是看实际动作——比如云台是否真的转动、抓图是否真的能打开、回放流是否真的能拉起来。

mvn test -Dtest=OnvifRegressionTest -Ddevice.ip=192.168.1.64 -Ddevice.user=admin -Ddevice.pass=admin123

这段 Maven 命令把设备 IP 和凭据通过系统属性传入测试类,比硬编码在代码里灵活得多。失败时先看是不是断言字段不一致,再看是不是设备固件行为有差异。

6.3 我保留的几个本地习惯

从那以后,我每次接到新摄像头对接任务,都强制自己先跑一遍这套回归脚本,再进业务开发。设备到手先看 ONVIF 服务开关是否开启,再用 ODM 确认能力集,最后才动 SDK 代码。这套流程走下来,大部分兼容性问题在第一天就能暴露,而不是等到联调阶段才炸出来。SDK 本身封装了协议细节,但设备的多样性永远超出协议文本的覆盖范围,实测才是唯一的试金石。希望这份 SDK 和这套测试习惯能帮你在摄像头接入这条路上少走几步弯路,顺利把设备接入搞利索。

本文还有配套的精品资源,点击获取

相关新闻

知识工作插件实战:搭建高效采集整理输出工作流

知识工作插件实战:搭建高效采集整理输出工作流

“知识工作插件”这几年被反复提起&#xff0c;但真要问它到底是什么——是一类浏览器扩展&#xff0c;还是编辑器里的组件&#xff0c;又或者某个知识管理工具的二次开发能力&#xff1f;我自己的答案是&#xff1a;都不是单独一个&#xff0c;而是围绕“输入→处理→沉淀→输…

2026/10/21 6:12:29 阅读更多 →
机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

做机器人对话系统最头疼的一件事&#xff0c;不是意图识别&#xff0c;也不是自然语言生成&#xff0c;而是把真实世界接进来。用户问一句“我从现在的地方去服务中心怎么走”&#xff0c;你得在几百毫秒内完成坐标解析、路径计算、话术拼接&#xff0c;还得把路线图用卡片发出…

2026/10/21 6:11:29 阅读更多 →
桌面图标模拟FlappyBird:轻量级系统级交互实践

桌面图标模拟FlappyBird:轻量级系统级交互实践

1. 项目概述&#xff1a;让桌面图标“活”起来的轻量级游戏化实践你有没有试过盯着Windows或macOS桌面上那一排排静止的图标发呆&#xff1f;它们整齐、规范、功能明确&#xff0c;却也透着一股难以言说的机械感。最近在某高校数字媒体实验室带学生做交互小实验时&#xff0c;一…

2026/10/21 6:11:29 阅读更多 →

最新新闻

Linux网络学习【传输层协议UDP】

Linux网络学习【传输层协议UDP】

&#x1f525;承渊政道&#xff1a;个人主页 ❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C知识内容》 《Linux系统与网络知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 《Python知识内容》 《cpolar知识学习》 ✨…

2026/10/21 6:58:46 阅读更多 →
AI大模型落地最后一公里:收藏这份FDE工程师成长指南,小白程序员必看!

AI大模型落地最后一公里:收藏这份FDE工程师成长指南,小白程序员必看!

工业AI项目常卡在POC阶段&#xff0c;难以规模化落地。核心问题在于通用AI能力与千差万别的工业现场之间存在数据、设备、工况、业务流程等多重鸿沟。为填补这一空白&#xff0c;新职业“前线部署工程师”&#xff08;FDE&#xff09;应运而生。FDE是介于算法工程师与现场实施工…

2026/10/21 6:58:46 阅读更多 →
AIPM 是什么?

AIPM 是什么?

搜「AIPM」&#xff0c;你会同时撞见四种答案&#xff0c;它们互相不承认对方&#xff1a;岗位缩写、培训结业证、老认证的 AI 加课版、以及带公开能力模型与独立考试的标准化认证。 本文做三件事&#xff1a;拆开这个词的四种用法&#xff0c;给出两套可对照的参数表&#xff…

2026/10/21 6:58:46 阅读更多 →
CST有哪些典型应用场景?从天线设计到医疗成像,看电磁仿真如何走进真实研发

CST有哪些典型应用场景?从天线设计到医疗成像,看电磁仿真如何走进真实研发

当产品越来越智能、系统越来越复杂&#xff0c;电磁问题也不再只属于某一个专业环节。它可能出现在天线布局阶段&#xff0c;也可能暴露在EMC整改现场&#xff1b;可能影响高速互联链路的稳定性&#xff0c;也可能关系到人体暴露评估、医疗成像效果&#xff0c;甚至高端装备的隐…

2026/10/21 6:58:46 阅读更多 →
火炮周视瞄准镜初步设计:指标分解、光路构型与轴系精度校核

火炮周视瞄准镜初步设计:指标分解、光路构型与轴系精度校核

简介&#xff1a;这份文档面向兵器工程、光学仪器及火炮瞄准系统方向的学生与设计人员&#xff0c;围绕火炮周视瞄准镜的初步设计展开&#xff0c;解决从光学参数确定到系统结构选型的完整设计流程问题。资源包共1个doc文件&#xff0c;约395KB&#xff0c;内容为一份结构完整的…

2026/10/21 6:58:46 阅读更多 →
Linux僵尸、孤儿与守护进程:原理、区别与实战实现

Linux僵尸、孤儿与守护进程:原理、区别与实战实现

1. 项目概述&#xff1a;从“进程尸体”到“后台幽灵”的真实世界映射在 Linux 系统里&#xff0c;你执行ps aux | grep defunct时看到的<defunct>标记&#xff0c;不是报错&#xff0c;而是一具“进程尸体”——它已经死亡&#xff0c;却还没被收尸&#xff1b;你用nohu…

2026/10/21 6:57:46 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →