项目中经常需要使用海康的网络摄像头,做视频图像算法经常会用到rtsp流,但是rtsp一般很难保证实时性且解码效率不能保证.通过海康给的python的demo,对模块进行封装以方便python像调用opencv的VideoCaputure一样调用.目录结构如下

├── HKCam.py #自己写的封装

├── HCNetSDK.py # SDK给定
├── PlayCtrl.py #SDK给定
├── lib
│   ├── linux
│   │   ├── HCNetSDKCom
│   │   │   ├── libanalyzedata.so
│   │   │   ├── libAudioIntercom.so
│   │   │   ├── libHCAlarm.so
│   │   │   ├── libHCCoreDevCfg.so
│   │   │   ├── libHCDisplay.so
│   │   │   ├── libHCGeneralCfgMgr.so
│   │   │   ├── libHCIndustry.so
│   │   │   ├── libHCPlayBack.so
│   │   │   ├── libHCPreview.so
│   │   │   ├── libHCVoiceTalk.so
│   │   │   ├── libiconv2.so
│   │   │   ├── libStreamTransClient.so
│   │   │   └── libSystemTransform.so
│   │   ├── HCNetSDK_Log_Switch.xml
│   │   ├── libAudioRender.so
│   │   ├── libcrypto.so.1.1
│   │   ├── libHCCore.so
│   │   ├── libhcnetsdk.so
│   │   ├── libhpr.so
│   │   ├── libNPQos.so
│   │   ├── libopenal.so.1
│   │   ├── libPlayCtrl.so
│   │   ├── libssl.so.1.1
│   │   ├── libSuperRender.so
│   │   ├── libz.so
│   ├── win
│   │   ├── HCCore.dll
│   │   ├── HCNetSDKCom
│   │   │   ├── AnalyzeData.dll
│   │   │   ├── AudioIntercom.dll
│   │   │   ├── AudioRender.dll
│   │   │   ├── HCAlarm.dll
│   │   │   ├── HCAlarm.lib
│   │   │   ├── HCCoreDevCfg.dll
│   │   │   ├── HCDisplay.dll
│   │   │   ├── HCGeneralCfgMgr.dll
│   │   │   ├── HCGeneralCfgMgr.lib
│   │   │   ├── HCIndustry.dll
│   │   │   ├── HCPlayBack.dll
│   │   │   ├── HCPreview.dll
│   │   │   ├── HCPreview.lib
│   │   │   ├── HCVoiceTalk.dll
│   │   │   ├── libiconv2.dll
│   │   │   ├── OpenAL32.dll
│   │   │   ├── StreamTransClient.dll
│   │   │   └── SystemTransform.dll
│   │   ├── HCNetSDK.dll
│   │   ├── hlog.dll
│   │   ├── hpr.dll
│   │   ├── libcrypto-1_1-x64.dll
│   │   ├── libssl-1_1-x64.dll
│   │   ├── PlayCtrl.dll
│   │   └── zlib1.dll

# coding=utf-8
'''
HKCam.py
'''
import os
import platform
from HCNetSDK import *
from PlayCtrl import *
import numpy as np
import time
import cv2class HKCam(object):def __init__(self,camIP,username,password,devport=8000):# 登录的设备信息self.DEV_IP = create_string_buffer(camIP.encode())self.DEV_PORT =devportself.DEV_USER_NAME = create_string_buffer(username.encode())self.DEV_PASSWORD = create_string_buffer(password.encode())self.WINDOWS_FLAG = False if platform.system() != "Windows" else Trueself.funcRealDataCallBack_V30 = Noneself.recent_img = None #最新帧self.n_stamp = None #帧时间戳self.last_stamp = None #上次时间戳# 加载库,先加载依赖库if self.WINDOWS_FLAG:os.chdir(r'./lib/win')self.Objdll = ctypes.CDLL(r'./HCNetSDK.dll')  # 加载网络库self.Playctrldll = ctypes.CDLL(r'./PlayCtrl.dll')  # 加载播放库else:os.chdir(r'./lib/linux')self.Objdll = cdll.LoadLibrary(r'./libhcnetsdk.so')self.Playctrldll = cdll.LoadLibrary(r'./libPlayCtrl.so')# 设置组件库和SSL库加载路径    self.SetSDKInitCfg()# 初始化DLLself.Objdll.NET_DVR_Init()# 启用SDK写日志self.Objdll.NET_DVR_SetLogToFile(3, bytes('./SdkLog_Python/', encoding="utf-8"), False)os.chdir(r'../../') # 登录(self.lUserId, self.device_info) = self.LoginDev()self.Playctrldll.PlayM4_ResetBuffer(self.lUserId,1)print(self.lUserId)if self.lUserId < 0:err = self.Objdll.NET_DVR_GetLastError()print('Login device fail, error code is: %d' % self.Objdll.NET_DVR_GetLastError())# 释放资源self.Objdll.NET_DVR_Cleanup()exit()else:print(f'摄像头[{camIP}]登录成功!!')self.start_play()time.sleep(1)def start_play(self,):#global funcRealDataCallBack_V30self.PlayCtrl_Port = c_long(-1)  # 播放句柄# 获取一个播放句柄if not self.Playctrldll.PlayM4_GetPort(byref(self.PlayCtrl_Port)):print(u'获取播放库句柄失败')# 定义码流回调函数self.funcRealDataCallBack_V30 = REALDATACALLBACK(self.RealDataCallBack_V30)# 开启预览self.preview_info = NET_DVR_PREVIEWINFO()self.preview_info.hPlayWnd = 0self.preview_info.lChannel = 1  # 通道号self.preview_info.dwStreamType = 0  # 主码流self.preview_info.dwLinkMode = 0  # TCPself.preview_info.bBlocked = 1  # 阻塞取流# 开始预览并且设置回调函数回调获取实时流数据self.lRealPlayHandle = self.Objdll.NET_DVR_RealPlay_V40(self.lUserId, byref(self.preview_info), self.funcRealDataCallBack_V30, None)if self.lRealPlayHandle < 0:print ('Open preview fail, error code is: %d' %self. Objdll.NET_DVR_GetLastError())# 登出设备self.Objdll.NET_DVR_Logout(self.lUserId)# 释放资源self.Objdll.NET_DVR_Cleanup()exit()def SetSDKInitCfg(self,):# 设置SDK初始化依赖库路径# 设置HCNetSDKCom组件库和SSL库加载路径# print(os.getcwd())if self.WINDOWS_FLAG:strPath = os.getcwd().encode('gbk')sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()sdk_ComPath.sPath = strPathself.Objdll.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))self.Objdll.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'\libcrypto-1_1-x64.dll'))self.Objdll.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'\libssl-1_1-x64.dll'))else:strPath = os.getcwd().encode('utf-8')sdk_ComPath = NET_DVR_LOCAL_SDK_PATH()sdk_ComPath.sPath = strPathself.Objdll.NET_DVR_SetSDKInitCfg(2, byref(sdk_ComPath))self.Objdll.NET_DVR_SetSDKInitCfg(3, create_string_buffer(strPath + b'/libcrypto.so.1.1'))self.Objdll.NET_DVR_SetSDKInitCfg(4, create_string_buffer(strPath + b'/libssl.so.1.1'))def LoginDev(self,):# 登录注册设备device_info = NET_DVR_DEVICEINFO_V30()lUserId = self.Objdll.NET_DVR_Login_V30(self.DEV_IP, self.DEV_PORT, self.DEV_USER_NAME, self.DEV_PASSWORD, byref(device_info))return (lUserId, device_info)def read(self,):while self.n_stamp==self.last_stamp:continueself.last_stamp=self.n_stampreturn self.n_stamp,self.recent_imgdef DecCBFun(self,nPort, pBuf, nSize, pFrameInfo, nUser, nReserved2):if pFrameInfo.contents.nType == 3:t0 = time.time()# 解码返回视频YUV数据,将YUV数据转成jpg图片保存到本地# 如果有耗时处理,需要将解码数据拷贝到回调函数外面的其他线程里面处理,避免阻塞回调导致解码丢帧nWidth = pFrameInfo.contents.nWidthnHeight = pFrameInfo.contents.nHeight#nType = pFrameInfo.contents.nTypedwFrameNum = pFrameInfo.contents.dwFrameNumnStamp = pFrameInfo.contents.nStamp#print(nWidth, nHeight, nType, dwFrameNum, nStamp, sFileName)YUV = np.frombuffer(pBuf[:nSize],dtype=np.uint8)YUV = np.reshape(YUV,[nHeight+nHeight//2,nWidth])img_rgb = cv2.cvtColor(YUV,cv2.COLOR_YUV2BGR_YV12)self.recent_img,self.n_stamp = img_rgb,nStampdef RealDataCallBack_V30(self,lPlayHandle, dwDataType, pBuffer, dwBufSize, pUser):# 码流回调函数if dwDataType == NET_DVR_SYSHEAD:# 设置流播放模式self.Playctrldll.PlayM4_SetStreamOpenMode(self.PlayCtrl_Port, 0)# 打开码流,送入40字节系统头数据if self.Playctrldll.PlayM4_OpenStream(self.PlayCtrl_Port, pBuffer, dwBufSize, 1024*1024):# 设置解码回调,可以返回解码后YUV视频数据#global FuncDecCBself.FuncDecCB = DECCBFUNWIN(self.DecCBFun)self.Playctrldll.PlayM4_SetDecCallBackExMend(self.PlayCtrl_Port, self.FuncDecCB, None, 0, None)# 开始解码播放if self.Playctrldll.PlayM4_Play(self.PlayCtrl_Port, None):print(u'播放库播放成功')else:print(u'播放库播放失败')else:print(u'播放库打开流失败')elif dwDataType == NET_DVR_STREAMDATA:self.Playctrldll.PlayM4_InputData(self.PlayCtrl_Port, pBuffer, dwBufSize)else:print (u'其他数据,长度:', dwBufSize)def release(self):self.Objdll.NET_DVR_StopRealPlay(self.lRealPlayHandle)if self.PlayCtrl_Port.value > -1:self.Playctrldll.PlayM4_Stop(self.PlayCtrl_Port)self.Playctrldll.PlayM4_CloseStream( self.PlayCtrl_Port)self.Playctrldll.PlayM4_FreePort( self.PlayCtrl_Port)PlayCtrl_Port = c_long(-1)self.Objdll.NET_DVR_Logout(self.lUserId)self.Objdll.NET_DVR_Cleanup()print('释放资源结束')def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):self.release()if __name__=="__main__":camIP ='192.168.1.122'DEV_PORT = 8000username ='admin'password = 'admin'hkclass = HKCam(camIP,username,password)last_stamp = 0while True:t0 =time.time()n_stamp,img = hkclass.read()last_stamp=n_stampcv2.imshow('xxxxxx',cv2.resize(img,(800,600)))kkk = cv2.waitKey(1)if kkk ==ord('q'):breakhkclass.release()

https://gitee.com/MengNiMeia/python_hkcamhttps://gitee.com/MengNiMeia/python_hkcam

python通过ctypes调用海康网络sdk取流相关推荐

  1. (一)Qt+OpenCV调用海康工业相机SDK示例开发

    系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...

  2. Java SDK调用 海康网络摄像头 多摄像头同时预览 并取流

    写在前面: 最近也遇到了调用海康多个摄像头实现同时预览的需求,不过官方demo里并没详细的案例,上网查了下资料,也找不到对应的解决方案 ,电话咨询海康技术,没接过,信息没回过.这里就不对海康技术支持多 ...

  3. python调用海康网络摄像头,实时显示监控内容

    用网线将海康威视摄像头与电脑连接在一起:(或者用交换机,在一个交换机下面) 海康摄像头的默认ip是192.168.1.64 效果:和通过海康摄像头网址效果一样 rtsp://用户名:密码@ip地址/S ...

  4. 海康网络SDK概要分析

    设备网络SDK是基于设备私有网络通信协议开发的,为后端设备(嵌入式网络硬盘录像机.视频服务器).前端设备(网络摄像机.网络球机.IP模块)等产品服务的配套模块,用于远程访问和控制设备软件的二次开发.  ...

  5. 海康相机rtsp取流

    海康相机使用流程 https://www.hikvision.com/Cn/download_60.html下载ivms-4200 通过ip修改本地电脑IP置相同网段 可以通过rtsp取流 用户名:a ...

  6. 海康录像机RTSP取流路径

    最近在帮别人搞直播,需要录像机的RTSP地址,奈何海康录像机只能设置端口,地址没写出来,找了好久最后找到的资料,还要尝试组合...就没有直接显示出来的吗?最后试出来的地址rtsp://aaa:jt12 ...

  7. unity 调用 海康 网络摄像头 免费下载

    微信号:ITComputerGraph 更多精彩内容,关注公众号<IT木子李> csdn积分规则导致资源下载次数越多,需要的积分越高,本着奉献精神,博主特把所有资源放到微信公众号,欢迎大家 ...

  8. 海康摄像头SDK开机启动第一个摄像头不显示问题

    问题描述: 采用Qt调用海康摄像头SDK显示视频,开机软件自启动后第一个摄像头不显示. 原因分析: 第一个摄像头首次启动的时候,不显示视频.软件关闭然后重新打开,所有摄像头都正常显示.尝试发现采用bB ...

  9. 关于使用海康相机SDK采集图片并传递给C++的使用总结

    一.背景 需要用C#调用海康相机SDK采集图片,并将采集的图片以Byte[]数组的形式传递给C++版视觉处理dll 二.步骤 1.声明变量 public MyCamera myCamera;//相机对 ...

最新文章

  1. SQL SERVER中架构的理解
  2. visio如何扩大画布的大小. 鼠标移到画布的边界按住Ctrl,就可以拉大
  3. python 二维强度图_荐 python数据分析matplotlib库使用之二维图形绘制
  4. asp.net基础知识
  5. 关于java的取整/和取余%
  6. Apache默认端口80被占用无法启动服务问题
  7. centos netstat和ps感染木马解决方案
  8. 田渊栋团队新作:为什么非对比自监督学习效果好?
  9. android 物联网 pdf,android复习资料(物联网141).pdf
  10. 微信授权,重定向两次
  11. Linux四剑客详解——sed
  12. xgboost算法_XGBoost 原理 及 常见面试题
  13. 控制台中如何将IE11降级
  14. 阿里巴巴 Java 性能调优手册
  15. 阿里P3C自定义规则后本地打包成IDEA插件
  16. 开源磁盘加密软件VeraCrypt教程
  17. 选择性粘贴HTML,Excel中“选择性粘贴”的五种特殊用法
  18. Python数据分析学习系列 六 数据加载、存储与文件格式
  19. 中国银行基金代销一览表
  20. 人到底是为了什么活着?

热门文章

  1. ELISA试剂盒选购指南
  2. lxd容器安装cuda10.0
  3. socket_wirte、socket_read、socket_send、socket_recv
  4. matlab三次样条曲线的绘制(spline和csape函数详解)
  5. 服务器禁用怎么修复,WIN10系统疑难解答服务被禁用怎么恢复?
  6. 简单记录—vue 用js方法实现侧边导航栏联动选择
  7. 从seurat的findallmarkers得到的差异基因 进行富集分析clusterprolifer
  8. 网络安全的新基石,从“零信任”开始
  9. Java可以做什么及可以给我们带来什么?
  10. 猪年春节短信-猪年搞笑短信[合集]