CaptureDemo.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QMainWindow, QGroupBox, QMenu, QMessageBox
  3. from PyQt5.QtGui import QPixmap
  4. from CapturePictureUI import Ui_MainWindow
  5. from NetSDK.NetSDK import NetClient
  6. from NetSDK.SDK_Enum import EM_LOGIN_SPAC_CAP_TYPE
  7. from NetSDK.SDK_Struct import *
  8. from NetSDK.SDK_Callback import fDisConnect, fHaveReConnect, CB_FUNCTYPE
  9. @CB_FUNCTYPE(None, C_LLONG, POINTER(c_ubyte), c_uint, c_uint, C_DWORD, C_LDWORD)
  10. def CaptureCallBack(lLoginID, pBuf, RevLen, EncodeType, CmdSerial, dwUser):
  11. if lLoginID == 0:
  12. return
  13. print('Enter CaptureCallBack')
  14. wnd.update_ui(pBuf, RevLen, EncodeType)
  15. class CaptureWnd(QMainWindow, Ui_MainWindow):
  16. def __init__(self):
  17. super(CaptureWnd, self).__init__()
  18. self.setupUi(self)
  19. # 界面初始化
  20. self.init_ui()
  21. # NetSDK用到的相关变量和回调
  22. self.loginID = C_LLONG()
  23. self.m_DisConnectCallBack = fDisConnect(self.DisConnectCallBack)
  24. self.m_ReConnectCallBack = fHaveReConnect(self.ReConnectCallBack)
  25. # 获取NetSDK对象并初始化
  26. self.sdk = NetClient()
  27. self.sdk.InitEx(self.m_DisConnectCallBack)
  28. self.sdk.SetAutoReconnect(self.m_ReConnectCallBack)
  29. def init_ui(self):
  30. self.IP_lineEdit.setText('192.168.1.108')
  31. self.Port_lineEdit.setText('37777')
  32. self.User_lineEdit.setText('admin')
  33. self.Pwd_lineEdit.setText('hmkj6688')
  34. self.Login_pushButton.clicked.connect(self.login_btn_onclick)
  35. self.Logout_pushButton.clicked.connect(self.logout_btn_onclick)
  36. self.Capture_pushButton.clicked.connect(self.capture_btn_onclick)
  37. self.Login_pushButton.setEnabled(True)
  38. self.Logout_pushButton.setEnabled(False)
  39. self.Capture_pushButton.setEnabled(False)
  40. def login_btn_onclick(self):
  41. ip = self.IP_lineEdit.text()
  42. port = int(self.Port_lineEdit.text())
  43. username = self.User_lineEdit.text()
  44. password = self.Pwd_lineEdit.text()
  45. print(f"user: {username}, pass: {password}, host: {ip}:{port}")
  46. stuInParam = NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY()
  47. stuInParam.dwSize = sizeof(NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY)
  48. stuInParam.szIP = ip.encode()
  49. stuInParam.nPort = port
  50. stuInParam.szUserName = username.encode()
  51. stuInParam.szPassword = password.encode()
  52. stuInParam.emSpecCap = EM_LOGIN_SPAC_CAP_TYPE.TCP
  53. stuInParam.pCapParam = None
  54. stuOutParam = NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY()
  55. stuOutParam.dwSize = sizeof(NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY)
  56. self.loginID, device_info, error_msg = self.sdk.LoginWithHighLevelSecurity(stuInParam, stuOutParam)
  57. if self.loginID != 0:
  58. self.setWindowTitle('抓图(Capture)-在线(OnLine)')
  59. self.Login_pushButton.setEnabled(False)
  60. self.Logout_pushButton.setEnabled(True)
  61. if int(device_info.nChanNum) > 0:
  62. self.Capture_pushButton.setEnabled(True)
  63. for i in range(int(device_info.nChanNum)):
  64. self.Channel_comboBox.addItem(str(i))
  65. else:
  66. QMessageBox.about(self, '提示(prompt)', error_msg)
  67. def logout_btn_onclick(self):
  68. # 登出
  69. if self.loginID == 0:
  70. return
  71. result = self.sdk.Logout(self.loginID)
  72. self.Login_pushButton.setEnabled(True)
  73. self.Logout_pushButton.setEnabled(False)
  74. self.Capture_pushButton.setEnabled(False)
  75. self.setWindowTitle("抓图(Capture)-离线(OffLine)")
  76. self.loginID = 0
  77. self.Channel_comboBox.clear()
  78. self.Picture_label.clear()
  79. def capture_btn_onclick(self):
  80. # 设置抓图回调
  81. dwUser = 0
  82. self.sdk.SetSnapRevCallBack(CaptureCallBack, dwUser)
  83. channel = self.Channel_comboBox.currentIndex()
  84. snap = SNAP_PARAMS()
  85. snap.Channel = channel
  86. snap.Quality = 1
  87. snap.mode = 0
  88. # 抓图
  89. self.sdk.SnapPictureEx(self.loginID, snap)
  90. def update_ui(self, pBuf, RevLen, EncodeType):
  91. pic_buf = cast(pBuf, POINTER(c_ubyte * RevLen)).contents
  92. with open('./capture.jpg', 'wb+') as f:
  93. f.write(pic_buf)
  94. image = QPixmap('./capture.jpg').scaled(self.Picture_label.width(),
  95. self.Picture_label.height())
  96. self.Picture_label.setPixmap(image)
  97. # 实现断线回调函数功能
  98. def DisConnectCallBack(self, lLoginID, pchDVRIP, nDVRPort, dwUser):
  99. self.setWindowTitle("抓图(Capture)-离线(OffLine)")
  100. # 实现断线重连回调函数功能
  101. def ReConnectCallBack(self, lLoginID, pchDVRIP, nDVRPort, dwUser):
  102. self.setWindowTitle('抓图(Capture)-在线(OnLine)')
  103. # 关闭主窗口时清理资源
  104. def closeEvent(self, event):
  105. event.accept()
  106. if self.loginID:
  107. self.sdk.Logout(self.loginID)
  108. self.loginID = 0
  109. self.sdk.Cleanup()
  110. self.Picture_label.clear()
  111. if __name__ == '__main__':
  112. app = QApplication(sys.argv)
  113. wnd = CaptureWnd()
  114. wnd.show()
  115. sys.exit(app.exec_())