环境准备
在开始之前,需要从海康威视官网下载对应型号的工业相机 SDK 开发包。解压后通常包含动态库(.dll 或.so)和头文件。建议将 SDK 放置在无中文或特殊字符的本地路径下,避免加载时出现异常。
安装 Python 绑定库(以 hikvision 为例):
pip install hikvision
初始化与登录
SDK 使用的第一步是初始化环境并设置日志。这里通过 NET_DVR_Init 启动服务,同时指定日志级别和保存路径,方便后续排查问题。
from hikvision import NetSdk
NetSdk.NET_DVR_Init()
# 日志级别设为 3,保存到当前目录下的 sdk_log 文件夹
NetSdk.NET_DVR_SetLogToFile(3, "./sdk_log/")
接下来配置设备信息并登录。注意 IP、端口及账号密码需与实际设备一致,字符串编码建议使用 UTF-8。
device_info = NetSdk.NET_DVR_DEVICEINFO_V40()
login_params = NetSdk.NET_DVR_USER_LOGIN_INFO()
login_params.bUseTLS = 0
login_params.sDeviceAddress = "192.168.1.64".encode('utf-8')
login_params.wPort = 8000
login_params.sUserName = "admin".encode('utf-8')
login_params.sPassword = "password".encode('utf-8')
user_id = NetSdk.NET_DVR_Login_V40(login_params, device_info)
if user_id < 0:
print("Login failed, error code:", NetSdk.NET_DVR_GetLastError())
启动实时预览
登录成功后,即可配置预览参数。窗口句柄设为 0 表示不显示 UI 窗口,仅获取数据流;通道号和码流类型根据实际设备调整。
preview_params = NetSdk.NET_DVR_PREVIEWINFO()
preview_params.hPlayWnd = 0 # 窗口句柄,0 表示不显示
preview_params.lChannel = 1 # 通道号
preview_params.dwStreamType = 0 # 主码流
preview_params.dwLinkMode = 0 # TCP 模式
realplay_handle = NetSdk.NET_DVR_RealPlay_V40(user_id, preview_params)
if realplay_handle < 0:
print("Preview failed, error code:", NetSdk.NET_DVR_GetLastError())
回调处理数据
视频流数据需要通过回调函数接收。注册 NET_DVR_SetStandardDataCallBack 后,当有数据到达时会触发该函数。注意回调内不要执行耗时操作,否则会影响帧率。
def data_callback(lRealHandle, dwDataType, pBuffer, dwBufSize, pUser):
if dwDataType == NetSdk.NET_DVR_STREAMDATA:
print("Received data size:", dwBufSize)
# 此处可添加图像解码或处理逻辑
NetSdk.NET_DVR_SetStandardDataCallBack(realplay_handle, data_callback, None)
资源释放与异常处理
程序结束前务必按顺序清理资源:先停止预览,再注销登录,最后清理 SDK 环境。每一步都要检查返回值,利用 NET_DVR_GetLastError 获取具体错误码。
# 正常退出流程
NetSdk.NET_DVR_StopRealPlay(realplay_handle)
NetSdk.NET_DVR_Logout(user_id)
NetSdk.NET_DVR_Cleanup()
# 异常捕获示例
error_code = NetSdk.NET_DVR_GetLastError()
if error_code != 0:
print("Error occurred, code:", error_code)
注意事项
- 版本匹配:SDK 版本需与相机固件保持一致,跨版本可能导致兼容性问题。
- 网络配置:工业相机通常需要手动配置子网掩码、网关等参数以确保连通性。
- 性能优化:实时预览的数据回调函数应轻量,建议配合队列进行异步处理,避免阻塞主线程。

