stream.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import os
  2. import cv2
  3. import time
  4. import requests
  5. from logger import logger
  6. class StreamCapture:
  7. def __init__(self, ip, channel, reconnect_interval=5):
  8. self.channel = channel
  9. self.ip = ip
  10. self.reconnect_interval = reconnect_interval
  11. self.cap = None
  12. self.stream_url = None
  13. def get_stream_url(self):
  14. data = {
  15. "channel": str(self.channel),
  16. "ip":self.ip
  17. }
  18. url = requests.post(url='http://172.19.152.231/open/api/operate/previewURLs',data=data).json()['msg']
  19. self.stream_url = url
  20. return url
  21. def get_frame(self):
  22. if self.cap is None or not self.cap.isOpened():
  23. return None, False
  24. ret, frame = self.cap.read()
  25. if not ret:
  26. return None, False
  27. return frame, ret
  28. def reconnect(self):
  29. stream_url = self.get_stream_url()
  30. logger.info(f"Reconnect {stream_url} ...")
  31. self.cap.release()
  32. self.cap = cv2.VideoCapture(stream_url)
  33. if not self.cap.isOpened():
  34. logger.info("Reconnect failed")
  35. return False
  36. logger.info("Reconnect success")
  37. return True
  38. def close(self):
  39. self.cap.release()
  40. def __call__(self):
  41. stream_url = self.get_stream_url()
  42. logger.info(f"Connect {stream_url} ...")
  43. self.cap = cv2.VideoCapture(stream_url)
  44. if not self.cap.isOpened():
  45. logger.info("Connect failed")
  46. yield None, False
  47. logger.info("Connect sucess")
  48. while True:
  49. frame, sucess = self.get_frame()
  50. if not sucess:
  51. logger.info("Disconnect ...")
  52. while not self.reconnect():
  53. time.sleep(self.reconnect_interval)
  54. yield frame, sucess
  55. self.cap.release()
  56. if __name__ == "__main__":
  57. stream = StreamCapture()
  58. for frame, ret in stream():
  59. if not ret:
  60. print("Cannot Get Image")
  61. continue