Commit cbc73367 authored by Bruce's avatar Bruce

Save Stream per hours by random range in 5 min

parent 0f93fd8f
...@@ -4,7 +4,7 @@ from queue import Queue ...@@ -4,7 +4,7 @@ from queue import Queue
import time, numpy as np, cv2 import time, numpy as np, cv2
class Camera(object): class Camera(object):
def __init__(self,_id,video_path,encoder=None, width=1280, height=720, framerate=30, log=None, maxsize=10): def __init__(self,_id,video_path,encoder=None, width=1280, height=720, framerate=30, log=None, maxsize=10 , use_gstr=True):
self.ID = _id self.ID = _id
self.__log = self.__log if log is None else log self.__log = self.__log if log is None else log
self.__isCaptured = False self.__isCaptured = False
...@@ -15,7 +15,7 @@ class Camera(object): ...@@ -15,7 +15,7 @@ class Camera(object):
self.height = height self.height = height
self.framerate = framerate self.framerate = framerate
self.encoder = encoder self.encoder = encoder
self.use_gstr = False self.use_gstr = use_gstr
self.__thread = Thread(target=self.__job) self.__thread = Thread(target=self.__job)
self.resultQueue = Queue(maxsize=maxsize) self.resultQueue = Queue(maxsize=maxsize)
def start(self): def start(self):
......
import datetime
import os
import numpy as np
import sys
import time
import threading
class VideoSplitWriter(threading.Thread):
"""VideoSplitWriter
Saving Video Stream as mp4 per hours. With random 5 minute range.
"""
def __init__(self):
threading.Thread.__init__(self)
self.lastRunTime = None
self.lastWritingTime = None
self.is_Saving = False
self.is_Running = False
self.fourcc= cv2.VideoWriter_fourcc('m','p','4','v')
self.writer = None # cv2.VideoWriter('datetime',fourcc,30.0,(1920,1080))
self.SaveRoot= os.path.join(os.path.expanduser("~"),"Videos","save")
self.Frame = None
def run(self):
self.is_Running = True
self.lastRunTime = datetime.datetime.now() - datetime.timedelta(hours = 1)
while self.is_alive() and self.is_Running:
if datetime.datetime.now() - self.lastRunTime >= datetime.timedelta(hours = 1):
self.SetlastRunTime()
if not self.is_Saving:
dd = datetime.datetime.now()
Write_minute = np.random.randint(dd.minute,60)
Write_second = np.random.randint(dd.second,60)
wait_flag = True
symbo=['/','-','\\']
count = 0
while wait_flag:
dd = datetime.datetime.now()
if dd.minute >= Write_minute and dd.second >= Write_second:
wait_flag = False
sys.stdout.write(f"\rwait for writing until {str(self.lastRunTime.hour).zfill(2)}:{str(Write_minute).zfill(2)}:{str(Write_second).zfill(2)}...{symbo[count%3]}")
count+=1
time.sleep(1)
self.StarWriting()
print (f"StarWriting at {self.lastWritingTime}")
while datetime.datetime.now() - self.lastWritingTime < datetime.timedelta(minute = 5):
count = 0
while self.Frame is None:
sys.stdout.write(f"\rwait for new frame...{symbo[count%3]}")
count+=1
self.writer.write(self.Frame)
cv2.waitKey(33)
self.Frame = None
self.StopWriting()
print (f"StopWriting at {datetime.datetime.now()}")
else:
time.sleep(1000*60*60)
def SetlastRunTime(self):
self.lastRunTime = datetime.datetime.now()
def StarWriting(self):
self.is_Saving = True
self.lastWritingTime = datetime.datetime.now()
dd = self.lastWritingTime
video_folder = os.path.join(self.SaveRoot,f"{str(dd.month).zfill(2)}/{str(dd.day).zfill(2)}/{str(dd.hour).zfill(2)}")
if not os.path.exists(video_folder):
os.makedirs(video_folder)
video_path = os.path.join(video_folder,f"{str(dd.minute).zfill(2)}-{str(dd.second).zfill(2)}.mp4")
self.writer = cv2.VideoWriter(video_path,self.fourcc,30.0,(1920,1080))
def StopWriting(self):
self.is_Saving = False
if self.writer:
self.writer.release()
print("Saved before Released")
self.writer = None
def __del__(self):
if self.writer:
self.writer.release()
self.is_Running = False
self.join()
if __name__ == '__main__':
# video writer per hour
import cv2
import datetime
source="rtsp://192.168.5.218/txg/01"
is_display = False
cap=cv2.VideoCapture(source)
VioWri = VideoSplitWriter()
VioWri.start()
break_flag=False
try:
if is_display:
cv2.namedWindow("1",cv2.WINDOW_NORMAL)
cv2.resizeWindow("1",1280,720)
while True:
if break_flag:
break
ret,frame=cap.read()
if ret:
VioWri.Frame = frame
if is_display:
cv2.imshow("1",frame)
key=cv2.waitKey(33)
if key==ord('q'):
break_flag=True
break
except Exception as e:
raise(e)
cap.release()
del(VioWri)
cv2.destroyAllWindows()
finally:
cap.release()
del(VioWri)
cv2.destroyAllWindows()
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment