stream.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. def get_stream_url(self):
  13. data = {
  14. "channel": str(self.channel),
  15. "ip":self.ip
  16. }
  17. url = requests.post(url='http://172.19.152.231/open/api/operate/previewURLs',data=data).json()['msg']
  18. return url
  19. def get_frame(self):
  20. if self.cap is None or not self.cap.isOpened():
  21. return None, False
  22. ret, frame = self.cap.read()
  23. if not ret:
  24. return None, False
  25. return frame, ret
  26. def reconnect(self):
  27. stream_url = self.get_stream_url()
  28. logger.info(f"Reconnecting... {stream_url}")
  29. self.cap.release()
  30. self.cap = cv2.VideoCapture(stream_url)
  31. if not self.cap.isOpened():
  32. logger.info("Reconnect failed")
  33. return False
  34. logger.info("Reconnect success")
  35. return True
  36. def __call__(self):
  37. stream_url = self.get_stream_url()
  38. logger.info(f"Connecting... {stream_url}")
  39. self.cap = cv2.VideoCapture(stream_url)
  40. if not self.cap.isOpened():
  41. logger.info("Connect failed")
  42. yield None, False
  43. logger.info("Connect sucess")
  44. while True:
  45. frame, sucess = self.get_frame()
  46. if not sucess:
  47. logger.info("Disconnect...")
  48. while not self.reconnect():
  49. time.sleep(self.reconnect_interval)
  50. yield frame, sucess
  51. self.cap.release()
  52. if __name__ == "__main__":
  53. stream = StreamCapture()
  54. for frame, ret in stream():
  55. if not ret:
  56. print("Cannot Get Image")
  57. continue