Python3.6在Ubuntu 16.04下调用海康Linux SDK动态库总是失败怎么办?

从海康官网下载的最新版 64 位 sdk,在 py3.6 下用 ctypes 调用 libso 动态库文件,访问 nvr 下的摄像头。。。莫名总是失败,确切说登录成功,但是在 Ubuntu1604 下一调用抓图,就提示抓图失败,失败代码 107 或者 47,同样的代码在 cent6 下可以。。。不知道是系统的锅还是海康 sdk 的锅。。。有踩过坑的 v 友么,给点提示
Python3.6在Ubuntu 16.04下调用海康Linux SDK动态库总是失败怎么办?

2 回复

我遇到类似问题,海康SDK在Ubuntu 16.04上确实有些坑。核心问题是库依赖和Python调用方式。

首先确保SDK基础环境正确:

  1. 检查libhcnetsdk.so是否在/usr/lib或通过LD_LIBRARY_PATH指定
  2. 安装32位兼容库(如果SDK是32位):
sudo apt-get install lib32stdc++6 lib32z1

关键代码示例(使用ctypes正确加载):

import ctypes
import os

# 1. 设置库路径(根据实际位置调整)
os.environ['LD_LIBRARY_PATH'] = '/opt/HikSDK/lib'

# 2. 加载依赖库(按顺序)
ctypes.CDLL('libpthread.so.0', mode=ctypes.RTLD_GLOBAL)
ctypes.CDLL('libcrypto.so.1.0.0', mode=ctypes.RTLD_GLOBAL)  # 注意版本
ctypes.CDLL('libssl.so.1.0.0', mode=ctypes.RTLD_GLOBAL)

# 3. 加载海康主库
try:
    hik_lib = ctypes.CDLL('/opt/HikSDK/lib/libhcnetsdk.so')
    print("SDK加载成功")
except Exception as e:
    print(f"加载失败: {e}")
    exit(1)

# 4. 定义函数原型(示例:初始化)
NET_DVR_Init = hik_lib.NET_DVR_Init
NET_DVR_Init.restype = ctypes.c_bool
NET_DVR_Init.argtypes = []

if NET_DVR_Init():
    print("初始化成功")
else:
    print("初始化失败")

常见陷阱:

  • Ubuntu 16.04默认OpenSSL版本可能不匹配,需要安装libssl1.0.0
  • 如果报undefined symbol,尝试在加载主库前先加载libHCCore.so
  • Python3.6的ctypes默认编码问题,字符串参数需用ctypes.c_char_p(b"string")

总结:按顺序加载依赖库是关键。


以我多年的经验,基本上都是自己的问题,海康的 libso 动态库,理论上只需要操作系统和架构匹配了就能用。
动态库有可能还依赖其他动态库,可以使用 ldd 命令查看。
访问摄像头,本质上就是访问海康摄像头的 8000 端口,http 连接,所以应该没什么与系统相关的依赖。

回到顶部