控制海康球头的 3 种方法

做了一些调查,目前控制海康球头相机的方法主要有三种:

  1. 海康官方 SDK。海康开放平台提供了多个平台的 SDK,包括 Windows、x86 Linux 和 ARM Linux(Jetson)等。Jetson 平台通常应选择 ARM 64 位 Linux 版本
  2. ONVIF。ONVIF 本身是网络视频设备的开放协议,使用 Python 控制时,需要选择对应的 ONVIF Python 库。部分较早的库对 Python 2 支持更早,使用起来会有些麻烦
  3. HTTP / ISAPI 方式。这种方式思路和实现都比较直接,可以通过 HTTP 请求控制云台、预置点等功能

上述三种方式各有优劣。HTTP / ISAPI 的优势是思路简单、调试方便,但不同设备型号和固件版本的接口可能不完全一致,最好优先查对应型号的接口文档。浏览器按 F12 打开调试模式、观察 Web 管理页面发出的请求,也可以作为辅助定位命令的办法。

ONVIF 的优势是协议相对通用,但需要处理设备鉴权、服务发现和不同厂商兼容性等问题。我当时没有装成功,这可能就是它的劣势……

官方 SDK 的上手难度高一些,但接口覆盖更完整,也更适合后续做工程化封装。


SDK

除了 ARM 的 SDK 外,我当时下载到的其他平台 SDK 中都提供了 Python demo。这个 demo 是多平台通用的,我也没搞清楚为什么当前 ARM 版本下载包中没有直接附带这一份示例。不过其他平台的 Python demo 仍然可以作为参考,核心思路都是通过 Python 加载 HCNetSDK 动态库,再调用 SDK 中的函数。

其中有三个主要文件:HCNetSDK.pyPlayCtrl.pytest_main.py,以及两个文件夹。我们需要将所需平台的 SDK 库放入 lib 文件夹中。

test_main.py 中,能看到:

os.chdir(r'./lib/linux')

这就是 .so 文件存放的路径。需要注意的是,os.chdir(r'./lib/linux') 对脚本启动时的工作目录比较敏感。如果从不同目录启动脚本,可能会找不到库文件。更稳妥的写法是基于脚本所在目录拼接绝对路径,再切换到对应的 lib/linux 目录。

此外,在 __init__ 中能看到设备登录信息,以及加载 .so 库的实现。将库加载到 self.Objdll 对象并实例化 HKCam 这个类后,便可以使用 self.Objdll.函数名 的形式调用 HCNetSDK 中的函数。

比如需要令相机复位至预置点 0,可以定义一个函数:

def reset_pos(self, posID):
    result = self.Objdll.NET_DVR_PTZPreset(self.lRealPlayHandle, GOTO_PRESET, posID)
    return result

其中,GOTO_PRESET 是 SDK 中预定义的宏值,posID 是在海康相机预览界面或设备配置中设置好的预置点编号。这里的 self.lRealPlayHandle 一般需要是有效的预览句柄,不同 SDK 版本的函数签名和参数约束应以官方头文件或文档为准。

其他控制功能,比如变焦、旋转、调用预置点等,都可以根据 SDK 文档中对应的 PTZ 控制函数实现。


[1] 海康开放平台 SDK 下载

[2] 树莓派 Python 实现 HTTP 请求控制海康威视摄像头转动