12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import os
- import cv2
- import time
- import requests
- from logger import logger
- class StreamCapture:
- def __init__(self, ip, channel, reconnect_interval=5):
- self.channel = channel
- self.ip = ip
- self.reconnect_interval = reconnect_interval
- self.cap = None
- self.stream_url = None
- def get_stream_url(self):
- data = {
- "channel": str(self.channel),
- "ip":self.ip
- }
- url = requests.post(url='http://172.19.152.231/open/api/operate/previewURLs',data=data).json()['msg']
- self.stream_url = url
- return url
-
- def get_frame(self):
- if self.cap is None or not self.cap.isOpened():
- return None, False
- ret, frame = self.cap.read()
- if not ret:
- return None, False
- return frame, ret
- def reconnect(self):
- stream_url = self.get_stream_url()
- logger.info(f"Reconnect {stream_url} ...")
- self.cap.release()
- self.cap = cv2.VideoCapture(stream_url)
- if not self.cap.isOpened():
- logger.info("Reconnect failed")
- return False
- logger.info("Reconnect success")
- return True
- def close(self):
- self.cap.release()
- def __call__(self):
- stream_url = self.get_stream_url()
- logger.info(f"Connect {stream_url} ...")
- self.cap = cv2.VideoCapture(stream_url)
- if not self.cap.isOpened():
- logger.info("Connect failed")
- yield None, False
- logger.info("Connect sucess")
-
- while True:
- frame, sucess = self.get_frame()
- if not sucess:
- logger.info("Disconnect ...")
- while not self.reconnect():
- time.sleep(self.reconnect_interval)
- yield frame, sucess
- self.cap.release()
- if __name__ == "__main__":
- stream = StreamCapture()
- for frame, ret in stream():
- if not ret:
- print("Cannot Get Image")
- continue
|