简介:海康威视OCX控件是一份面向视频监控应用开发者的 Windows 组件封装包,基于 ActiveX/OCX 技术,将海康威视摄像头、NVR 等硬件能力集成为可复用的视频预览、抓拍、录像、云台控制、对讲与声音调节等接口,适合需要快速在桌面程序中接入监控功能的 C++ 开发者。压缩包共 56 个文件,主要包括 NetVideoActiveX23.ocx 控件本体、PlayCtrl.dll 等运行库、netvideoactivex.h 等头文件、register.bat 注册脚本以及 PCDVRDVRDEMO 示例工程源码,整体约 5.48MB,结构上同时包含 doc 接口说明与 demo 演示程序,便于二次开发。目前已有 4228 人学习下载。借助该开发包,开发者可对照 h/cpp 源码和接口文档理解控件调用方式,借助注册脚本快速完成环境部署,从而降低海康设备接入门槛,提升监控系统集成效率。 做海康威视Web视频接入有些年头了,每次接手一个新项目,碰到浏览器要装OCX控件还是会心头一紧。这套东西确实老旧,但在很多政企项目里就是绕不开,尤其涉及老设备、老平台、内网环境的时候,3200系列、ISAPI协议、Web控件这一套组合拳,仍然是不少系统的命门。
所以这篇不聊高大上的架构,就结合我实际项目里调海康威视OCX控件的经验,把从环境搭建、控件注册、接口调用到报错排查这条路上能踩的坑,一次性说清楚。不管你是刚开始接触海康二次开发的新手,还是被浏览器兼容性折磨的老手,这篇都能给你省下不少时间。
1. 海康OCX控件到底是个什么角色
1.1 它解决的是浏览器看不了视频的问题
先理清一个概念。海康威视的摄像头和录像机(NVR/DVR)本身是可以通过网页访问的,设备内置了Web服务,你在浏览器里输入设备IP就能打开登录页。问题在于,视频监控的实时预览、回放、云台控制这些操作,在早期技术框架下必须要有一个本地组件去和设备底层通信,这个组件就是OCX控件。
OCX(OLE Control eXtension)是微软ActiveX技术体系下的一种控件形态,海康把视频解码、播放、抓图等功能封装成WebControl,网页通过<object>标签加载它,JavaScript再调用控件暴露出来的接口。换句话说,浏览器负责页面和交互,真正干活的解码和渲染是控件完成的。
搞懂了这一层,你就能明白为什么OCX控件只能在IE内核浏览器、或者支持ActiveX的浏览器环境下运行。Chrome 45之后的版本彻底移除了NPAPI支持,Firefox也早就砍掉了ActiveX支持,所以现在还在要求客户装OCX控件的项目,基本都锁定了Windows + IE/360兼容模式这个组合。
1.2 控件家族里有哪些版本要分清
海康的OCX控件在项目里见过好几个版本,千万不要搞混。
早期老设备用的一般是WebComponentsKit.exe或者netVideoPlayerOCX.ocx,针对海康早期的Web SDK。后来Web SDK更新换代,集成的控件变成了webcontrol.dll或者videoWebControl.ocx,对应开发包里会有webcontrol.exe这个安装程序。再往后,海康推出了无插件方案,也就是新版Web SDK配合WebControl插件通过WebSocket通信,甚至纯HTML5播放。
项目里最常碰到的还是那个老的OCX方案,也就是开发包CH-HCNetSDK_VXXXX_Web.zip里带的WebControl.exe。这个安装包会往系统里注册WebVideoControl.ocx这个组件,网页里ClassID对应的是566304FF-4039-4A0D-BC45-27AC1262B6E6之类的一串GUID。写代码的时候,ClassID必须和控件实际注册的一致,这个在排错时经常是个坑。
2. 环境准备与安装避坑全记录
2.1 装控件、注册控件的正确姿势
海康OCX控件的安装,理论上很简单:双击WebControl.exe,一路下一步。但实际项目里,这一布就能拦住不少客户。
最常见的问题是杀毒软件拦截。regsvr32注册ocx或者dll这个动作,会被部分安全软件视为高风险行为。我在一个项目里碰到过,客户装完控件后预览黑屏,打开系统事件查看器发现控件注册失败,最后定位到是安全软件把sadll.dll给隔离了。处理方法很简单,安装时临时退出安全软件,或者在安全软件里把海康的安装目录和控件目录加入白名单。
装完之后验证是否注册成功,Win+R打开运行框,输入:
regsvr32 WebVideoControl.ocx如果弹出注册成功的提示,说明控件没问题。要是报unable to register the dll/ocx regsvr32这样的错,大概率是以下几个原因:
- 没有用管理员权限运行命令行。这个最普遍,右键以管理员身份运行,能解决一半以上问题。
- 控件文件被占用,需要先关闭所有浏览器页面和调用控件的程序。
- 系统缺少VC++运行库。海康控件依赖
msvcp100.dll、msvcr100.dll这些,装一下对应版本的VC++ 2010运行库就好。 - 64位系统和32位控件混用。如果用的是32位控件,
regsvr32也要用C:\Windows\SysWOW64\regsvr32.exe。
2.2 IE设置和浏览器兼容,这一关躲不掉
就算控件注册成功,浏览器加载不出来同样白搭。IE浏览器加载ActiveX控件有一套安全机制,必须手动放行。
在IE的“Internet选项-安全-自定义级别”里,需要启用以下几个选项:
- “ActiveX控件和插件”下的“对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本”设为启用或提示。
- “下载已签名的ActiveX控件”设为启用。
- “允许运行以前未使用的ActiveX控件而不提示”设为启用。
实际操作里,把站点加入“受信任的站点”,然后把受信任站点的安全级别里的ActiveX相关选项全部放开,是最省事的做法。
如果是360浏览器、搜狗浏览器这类双核浏览器,需要手动切到兼容模式,也就是IE内核。很多客户打开页面是一片空白或者提示“控件未安装”,其实不是控件没装,而是浏览器用的是极速内核,根本不认ActiveX。
还有一个隐蔽的问题,就是pageoffice控件安装后依然提示让安装类似的情况在海康上也会出现。原因多半是网页里的ClassID和实际注册的控件GUID不一致。这时候用regedit打开注册表,在HKEY_CLASSES_ROOT\CLSID下找到控件的GUID,确认注册信息存在,同时核对网页源码里的classid是否匹配。海康不同版本SDK的控件GUID会有差异,最常见的是页面用了新版SDK的ClassID,客户却装了旧版控件,或者反过来。
3. 标准接入流程与核心接口实战
3.1 初始化、登录、预览,三步走
海康OCX控件的调用逻辑比较固定,写页面基本就是三板斧:初始化控件、用设备IP和端口登录、按通道号开始预览。
先说最基础的HTML挂载。
<object id="hkWebControl" classid="clsid:566304FF-4039-4A0D-BC45-27AC1262B6E6" width="100%" height="100%" style="display:block;"></object>这里的classid要按实际控件的GUID来写。然后JavaScript部分:
function initPlugin() { var oWebControl = document.getElementById('hkWebControl'); // 初始化控件,参数是控件挂载的DOM节点ID oWebControl.Init('hkWebControl', 800, 600, { bNoMenu: false, iRsaType: 0 }); // 监听页面关闭,释放资源 window.onbeforeunload = function () { oWebControl.JS_Disconnect(); }; }登录设备的调用方式,老版SDK和较新的WebSDK差异较大。老的OCX接口风格是这样的:
// 设置设备信息并连接 oWebControl.JS_SetDeviceConnect( deviceIp, // 设备IP devicePort, // 设备端口,默认8000 username, // 登录用户名 password // 登录密码 );也有新版SDK先JS_RequestLogin获取随机密钥,再做RSA加密登录的流程。具体用哪一套,看你拿到的SDK版本和对应的开发文档。建议直接参考开发包里的demo页面,海康每个版本的SDK都会带完整的示例页面,直接在该页面基础上改是最靠谱的,自己从头写容易踩接口不存在的坑。
预览接口的调用模式:
// 开始预览,通道号从1开始,码流类型0表示主码流,1表示子码流 oWebControl.JS_StartVideo(1, 0);停止预览:
oWebControl.JS_StopVideo(1);这里有个经验之谈:海康设备的通道号是1开始的整数,和平台软件里看到的通道编号不一定一一对应,尤其接入了第三方平台或做了通道映射之后。出错时优先核对设备本身的通道配置,或者先用设备网页直接预览确认通道号。
3.2 抓图、录像回放和云台控制,这些接口也得会
除了预览,项目里最常用的就是抓图和录像回放。抓图接口一般长这样:
var ret = oWebControl.JS_CapturePicture( savePath, // 保存路径,比如 D:\\capture\\test.jpg picType, // 图片类型,0为JPEG quality // 图片质量,0-100 );调用前要确保保存目录存在并且有写权限。很多客户反馈“抓图失败”,最后查明是程序没有创建目录的权限,路径填了不存在的盘符,或者保存到了系统保护目录。
回放功能需要先停止预览,再调用回放接口。这个逻辑顺序很重要,不停止预览直接回放,部分固件版本会提示“设备资源不足”。接口方面,需要先按时间查询录像文件:
// 获取指定时间段内的录像文件列表 oWebControl.JS_GetRecordFileList( chanNo, // 通道号 startTime, // 开始时间,格式 'YYYY-MM-DD HH:MM:SS' endTime, // 结束时间 typeNum // 录像类型,0全部,1定时,2报警等 );拿到录像文件列表后,再进行回放播放。老控件通常支持JS_PlayRecord按文件名或时间点播放,新版SDK接口名有所调整,以对应文档为准。
云台控制的接口也比较直观:
// 方向控制,direction取值:0停止,1上,2下,3左,4右 oWebControl.JS_SetPTZControl(1, 1, 0);实际项目中,很多人容易忽略云台控制的停止指令。方向控制的第3个参数如果是持续执行,那么调用后必须在一定时间后再发一次停止指令,否则云台会一直转到限位才会停。这个在调试时特别容易疑惑,最后养成习惯:每次方向调用后都配合一个延时停止。
3.3 事件回调、资源释放这些隐形细节
控件的调用不全是主动式的,很多状态变化是通过事件回调通知前端的。比如设备断线、预览异常、录像状态变化,控件会触发对应事件。老版OCX的事件订阅方式是把回调函数挂到控件对象上,比如:
oWebControl.AttachEvent('OnException', function (iErrorCode) { // 处理控件异常,比如设备断线、网络异常 console.log('control error: ' + iErrorCode); });调试时强烈建议把异常回调里的错误码打出来。海康控件错误码是负数,每类问题对应特定数值,查开发文档里的错误码表能快速定位问题。我之前碰到过一个诡异现象:预览几秒后自动断开,错误码指向NET_DVR_NETWORK_FAIL_CONNECT,排查了一圈,最后发现是客户网络里交换机端口做了MAC地址绑定,更换了电脑后摄像头被限制连接。
资源释放是另一个容易被忽略的点。退出页面时必须调用断开和释放接口,否则控件进程在后台残留,导致下次打开页面显示“控件被占用”或者设备端显示“在线用户数已满”。完整退出逻辑:
window.onbeforeunload = function () { oWebControl.JS_StopVideo(1); oWebControl.JS_Disconnect(); oWebControl.JS_Release(); };另外多说一句,海康OCX控件本质是本地ActiveX组件,页面刷新时的加载速度受控件初始化影响,首次加载可能需要几秒钟。如果明显卡顿,检查一下是否调用了太多初始化参数,或者页面里挂载了多个控件实例。
4. 常见问题与排查技巧实录
4.1 控件使用高频问题速查表
这些年处理过的海康控件问题,整理成一张实战排查表,覆盖大多数场景。
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 提示控件未安装或未注册 | 控件未安装或注册被拦截 | 重新安装WebControl.exe,管理员权限运行regsvr32注册ocx文件,注意32/64位差异 |
| 控件已注册仍无法加载 | 浏览器非IE内核或不在兼容模式 | 切换360/搜狗等双核浏览器为兼容模式,或配置IE安全选项启用ActiveX |
| 页面白屏或控件区域空白 | 安全选项禁用了ActiveX | 将站点加入受信任站点,启用“ActiveX控件和插件”相关选项 |
| 预览黑屏无画面 | 设备登录失败、通道号错误、码流类型不对 | 核对设备IP/端口/账号密码,确认设备在线,用设备网页验证通道,切换主/子码流测试 |
| 预览几秒后自动断开 | 网络不稳定、设备连接数超限、MAC绑定 | 检查网络丢包、设备“在线用户”数量,协调网络管理员解除绑定限制 |
| 抓图失败报路径错误 | 目录不存在或无写权限 | 确认保存路径存在并有权限,路径使用\\转义,避免中文和空格 |
| 回放时提示设备资源不足 | 预览未停止、通道码流过大、设备性能瓶颈 | 先停止预览再回放,降低码流分辨率,升级设备固件 |
| 登录报RSA密钥错误 | 新旧SDK接口混用 | 核对SDK版本和Demo代码,确认登录流程采用同版本的接口逻辑 |
| 窗口全屏或缩放黑屏 | 控件未跟随DOM尺寸变化重绘 | 调用控件的JS_Resize接口,在窗口resize事件里同步调整控件尺寸 |
| 页面关闭后设备端用户数仍占用 | 未正确释放控件 | 在页面卸载事件中依次执行停止预览、断开连接、释放控件 |
4.2 衍生需求:RTSP取流和录像存储位置
除了通过OCX控件预览,项目里经常有人问海康设备的RTSP取流地址。直接给出格式:
rtsp://用户名:密码@设备IP:554/Streaming/Channels/101路径里的数字含义是:第一位1表示主码流(2表示子码流),后两位01表示通道号。比如通道1主码流是101,通道2子码流是202。如果设备开了RTSP的H.265编码,用VLC播放时确认VLC版本支持H.265,否则只有声音没有画面。
录像存储位置的问题,指的是录像文件存放在NVR或者摄像头的SD卡里,不是存在电脑上。如果客户问“海康威视下载录像存储位置在哪”,指的是通过客户端或浏览器下载录像到本地后,默认保存路径。4200客户端默认保存到C:\Users\用户名\Videos,也可以下载时手动指定目录。如果找不到之前下载的录像,去文档/视频目录翻一翻,或者直接在客户端“下载管理”里看任务路径。
监控时间不准的问题也是高频。设备时间不正确会导致录像时间轴错乱、回放检索不到录像。设置方法:进入设备Web端,“配置-系统-时间配置”,勾选“与计算机时间同步”或者手动校准,也可以配置NTP服务器自动校时。批量设备建议统一在NVR上开启NTP客户端,指定一台时间源服务器,避免每台设备时间漂移。
4.3 老设备兼容性和固件版本话题
热词里有个“海康威视网络硬盘录像机 v3.0.23 180720”,这是老款NVR的固件版本号。碰到这种老设备,新老控件的兼容性就是大问题。老固件设备只支持老版OCX控件接口,新版WebSDK可能连接不上,或者登录后拉不到设备能力集。
解决办法是“固件升级优先,控件版本匹配兜底”。先尝试在海康官网下载对应型号的最新固件升级,老设备升级后往往能兼容新版控件。如果设备太老,官网已下架固件,那就老老实实找对应版本的Web开发包,用老版OCX方式接入。
“海康威视新录像机可以用老摄像头吗”这类兼容性问题,项目中常见于老摄像头接入新NVR。海康新NVR通常向下兼容老摄像头,但需要注意ONVIF协议接入时可能需要手动添加设备。用海康自有协议(默认端口8000)接入时,用户名密码需要和摄像头页面的完全一致。接入后如果提示“不支持的码流类型”,多半是摄像头固件太老编码格式不兼容,给摄像头升级固件即可。
5. 控件之外:已经存在的现代替代方案
5.1 WebSDK“无插件”方案的真相
现在海康官方主推的是新版WebSDK,这套方案不再依赖ActiveX,控件形态变成了一套本地服务加WebSocket通信的“仿真插件”。页面通过WebSocket连接本地代理服务,服务再去和设备通信,视频流通过WebSocket或HTTP分发给前端播放。
这套方案的好处是摆脱了浏览器内核限制,Chrome、Edge、Firefox都能用。但它的本质还是有一个本地安装程序在跑,只是不再叫OCX。部署上一样的要装、要配置服务端口,服务挂了页面照样黑屏。
所以很多内网项目,IT策略要求不允许安装任何本地程序,这类场景“无插件”方案也不满足要求,只能走纯Web的RTSP转流方式。
5.2 纯Web方案的架构思路
完全不需要安装任何控件的方案,适合新项目选型,原理是把视频流在服务端转成浏览器能直接播放的格式。
最轻量的路线,是部署一个流媒体网关,拉取设备的RTSP流,转成HTTP-FLV或者HLS流,前端用flv.js或者hls.js播放。RTSP取流地址上面已经给了,网关配置时填好设备IP、端口、用户名密码即可。这类方案前端不再关心设备品牌,按标准播放器接入就行。
更规范的做法是走GB/T 28181国标平台。海康设备直接配置28181接入,把设备注册到国标平台,平台通过SIP信令做目录下发和设备控制,流媒体服务器负责取流和分发。前端对接平台开放的接口,视频播放走WebRTC或HLS。这种方案适合大型项目,海康、大华、宇视等不同品牌设备统一接入,热词里“大华、海康威视等国标视频平台”就是这个方向。
技术选型上的建议很直接:如果你的项目需要对接大量存量设备,且设备型号老旧,OCX方案最稳妥;如果是新项目、新设备,直接走WebSDK或者流媒体网关,不要再回头踩ActiveX的坑。我最近在写一个几百路摄像头的综合安防平台时,全部采用GB28181接入,前端统一用flv.js做播放,实施效率和稳定性都远超老方案。说到底,OCX不是不能用,而是要清楚它的适用边界,在什么场景选什么方案,才能少加班。
本文还有配套的精品资源,点击获取