RealPlayDemo.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # coding=utf-8
  2. import sys
  3. from ctypes import *
  4. from NetSDK.NetSDK import NetClient
  5. from NetSDK.SDK_Callback import fDisConnect, fHaveReConnect, fDecCBFun, fRealDataCallBackEx2
  6. from NetSDK.SDK_Enum import SDK_RealPlayType, EM_LOGIN_SPAC_CAP_TYPE, EM_REALDATA_FLAG
  7. from NetSDK.SDK_Struct import C_LLONG, sys_platform, NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY, NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY, PLAY_FRAME_INFO
  8. class RealPlayDemo:
  9. def __init__(self):
  10. # NetSDK用到的相关变量和回调
  11. self.loginID = C_LLONG()
  12. self.playID = C_LLONG()
  13. self.freePort = c_int()
  14. self.m_DisConnectCallBack = fDisConnect(self.DisConnectCallBack)
  15. self.m_ReConnectCallBack = fHaveReConnect(self.ReConnectCallBack)
  16. self.m_RealDataCallBack = fRealDataCallBackEx2(self.RealDataCallBack)
  17. # 获取NetSDK对象并初始化
  18. self.sdk = NetClient()
  19. self.sdk.InitEx(self.m_DisConnectCallBack)
  20. self.sdk.SetAutoReconnect(self.m_ReConnectCallBack)
  21. self.ip = ''
  22. self.port = 0
  23. self.username = ''
  24. self.password = ''
  25. self.channel = 0
  26. self.streamtype = 0
  27. def get_login_info(self):
  28. print("请输入登录信息(Please input login info)")
  29. print("")
  30. self.ip = input('地址(IP address):')
  31. self.port = int(input('端口(port):'))
  32. self.username = input('用户名(username):')
  33. self.password = input('密码(password):')
  34. def login(self):
  35. if not self.loginID:
  36. stuInParam = NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY()
  37. stuInParam.dwSize = sizeof(NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY)
  38. stuInParam.szIP = self.ip.encode()
  39. stuInParam.nPort = self.port
  40. stuInParam.szUserName = self.username.encode()
  41. stuInParam.szPassword = self.password.encode()
  42. stuInParam.emSpecCap = EM_LOGIN_SPAC_CAP_TYPE.TCP
  43. stuInParam.pCapParam = None
  44. stuOutParam = NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY()
  45. stuOutParam.dwSize = sizeof(NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY)
  46. self.loginID, device_info, error_msg = self.sdk.LoginWithHighLevelSecurity(stuInParam, stuOutParam)
  47. if self.loginID != 0:
  48. print("登录成功(Login succeed). 通道数量(Channel num):" + str(device_info.nChanNum))
  49. return True
  50. else:
  51. print("登录失败(Login failed). " + error_msg)
  52. return False
  53. def logout(self):
  54. if self.loginID:
  55. if self.playID:
  56. self.sdk.StopRealPlayEx(self.playID)
  57. self.playID = 0
  58. self.sdk.Logout(self.loginID)
  59. self.loginID = 0
  60. print("登出成功(Logout succeed)")
  61. def get_realplay_info(self):
  62. print("")
  63. print("请输入实时预览信息(Please input realplay info)")
  64. print("")
  65. self.channel = int(input('通道(channel):'))
  66. self.streamtype = int(input('码流类型(0:主码流; 1:辅码流)(stream type(0:Main Stream; 1:Extra Stream)):'))
  67. def realplay(self):
  68. if not self.playID:
  69. if self.streamtype == 0:
  70. stream_type = SDK_RealPlayType.Realplay
  71. else:
  72. stream_type = SDK_RealPlayType.Realplay_1
  73. self.playID = self.sdk.RealPlayEx(self.loginID, self.channel, 0, stream_type)
  74. if self.playID != 0:
  75. self.sdk.SetRealDataCallBackEx2(self.playID, self.m_RealDataCallBack, None, EM_REALDATA_FLAG.RAW_DATA)
  76. print("实时预览成功(RealPlay succeed).")
  77. return True
  78. else:
  79. print("实时预览失败(RealPlay fail). "+ self.sdk.GetLastErrorMessage())
  80. return False
  81. def stop_realplay(self):
  82. if self.playID:
  83. self.sdk.StopRealPlayEx(self.playID)
  84. self.playID = 0
  85. print("停止实时预览成功(Stop RealPlay succeed).")
  86. # 实现断线回调函数功能
  87. def DisConnectCallBack(self, lLoginID, pchDVRIP, nDVRPort, dwUser):
  88. print("实时预览(RealPlay)-离线(OffLine)")
  89. # 实现断线重连回调函数功能
  90. def ReConnectCallBack(self, lLoginID, pchDVRIP, nDVRPort, dwUser):
  91. print("实时预览(RealPlay)-在线(OnLine)")
  92. # 拉流回调函数功能
  93. def RealDataCallBack(self, lRealHandle, dwDataType, pBuffer, dwBufSize, param, dwUser):
  94. if lRealHandle == self.playID:
  95. if dwDataType == 0:
  96. # print("码流大小(Stream size):" + str(dwBufSize) + ". 码流类型:原始未加密码流(Stream type:original unencrypted stream)")
  97. data = cast(pBuffer, POINTER(c_ubyte * dwBufSize)).contents
  98. with open('./data', 'ab+') as f:
  99. f.write(data)
  100. # 关闭主窗口时清理资源
  101. def quit_demo(self):
  102. if self.loginID:
  103. self.sdk.Logout(self.loginID)
  104. self.sdk.Cleanup()
  105. print("程序结束(Demo finish)")
  106. if __name__ == '__main__':
  107. my_demo = RealPlayDemo()
  108. my_demo.get_login_info()
  109. result = my_demo.login()
  110. if not result:
  111. my_demo.quit_demo()
  112. else:
  113. my_demo.get_realplay_info()
  114. result = my_demo.realplay()
  115. if not result:
  116. my_demo.quit_demo()
  117. else:
  118. temp = input('输入任意键停止实时预览(Enter any key to stop realplay):')
  119. my_demo.stop_realplay()
  120. my_demo.logout()
  121. my_demo.quit_demo()