video.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # -*- coding: utf-8 -*-
  2. from socket import *
  3. import threading
  4. import cv2
  5. import struct
  6. import pickle
  7. import zlib
  8. class Video_Client(threading.Thread):
  9. def __init__(self, HOST, PORT):
  10. threading.Thread.__init__(self)
  11. print('video clinet start')
  12. self.setDaemon(True)
  13. self.ADDR = (HOST, PORT)
  14. self.sock = socket(AF_INET, SOCK_STREAM)
  15. def __del__(self):
  16. self.sock.close()
  17. try:
  18. cv2.destroyAllWindows()
  19. except:
  20. pass
  21. def run(self):
  22. self.sock.connect_ex(self.ADDR)
  23. print("video client connected...")
  24. data = "".encode("utf-8")
  25. payload_size = struct.calcsize("L")
  26. cv2.namedWindow('Remote', cv2.WINDOW_NORMAL)
  27. while True:
  28. try:
  29. while len(data) < payload_size:
  30. data += self.sock.recv(81920)
  31. packed_size = data[:payload_size]
  32. data = data[payload_size:]
  33. msg_size = struct.unpack("L", packed_size)[0]
  34. while len(data) < msg_size:
  35. data += self.sock.recv(81920)
  36. zframe_data = data[:msg_size]
  37. data = data[msg_size:]
  38. frame_data = zlib.decompress(zframe_data)
  39. frame = pickle.loads(frame_data)
  40. try:
  41. cv2.imshow('Remote', frame)
  42. key = cv2.waitKey(10)
  43. if key == ord('q'):
  44. print('client exit')
  45. cv2.destroyAllWindows()
  46. self.sock.close()
  47. except:
  48. print('video server error')
  49. cv2.destroyAllWindows()
  50. self.sock.close()
  51. except:
  52. self.sock.close()
  53. try:
  54. cv2.destroyAllWindows()
  55. except:
  56. pass
  57. print('server close')
  58. break