added ability to pass ffmpeg input and out parameters via config.yml

This commit is contained in:
ivelin 2019-08-21 16:14:34 -05:00
parent 700bd1e3ef
commit f65b323bcb

View File

@ -50,7 +50,9 @@ def get_frame_shape(rtsp_url):
# capture a single frame and check the frame shape so the correct array # capture a single frame and check the frame shape so the correct array
# size can be allocated in memory # size can be allocated in memory
video = cv2.VideoCapture(rtsp_url) video = cv2.VideoCapture(rtsp_url)
print("Reading video stream from URL: " + str(rtsp_url))
ret, frame = video.read() ret, frame = video.read()
print("OpenCV Video Read Ready: " + str(ret))
frame_shape = frame.shape frame_shape = frame.shape
video.release() video.release()
return frame_shape return frame_shape
@ -73,8 +75,8 @@ class CameraWatchdog(threading.Thread):
# wait a bit before checking # wait a bit before checking
time.sleep(10) time.sleep(10)
if (datetime.datetime.now().timestamp() - self.camera.frame_time.value) > 2: if (datetime.datetime.now().timestamp() - self.camera.frame_time.value) > 10:
print("last frame is more than 2 seconds old, restarting camera capture...") print("last frame is more than 10 seconds old, restarting camera capture...")
self.camera.start_or_restart_capture() self.camera.start_or_restart_capture()
time.sleep(5) time.sleep(5)
@ -121,7 +123,10 @@ class Camera:
self.recent_frames = {} self.recent_frames = {}
self.rtsp_url = get_rtsp_url(self.config['rtsp']) self.rtsp_url = get_rtsp_url(self.config['rtsp'])
self.take_frame = self.config.get('take_frame', 1) self.take_frame = self.config.get('take_frame', 1)
self.ffmpeg_log_level = self.config.get('ffmpeg_log_level', None)
self.ffmpeg_hwaccel_args = self.config.get('ffmpeg_hwaccel_args', []) self.ffmpeg_hwaccel_args = self.config.get('ffmpeg_hwaccel_args', [])
self.ffmpeg_input_args = self.config.get('ffmpeg_input_args', None)
self.ffmpeg_output_args = self.config.get('ffmpeg_output_args', None)
self.regions = self.config['regions'] self.regions = self.config['regions']
self.frame_shape = get_frame_shape(self.rtsp_url) self.frame_shape = get_frame_shape(self.rtsp_url)
self.frame_size = self.frame_shape[0] * self.frame_shape[1] * self.frame_shape[2] self.frame_size = self.frame_shape[0] * self.frame_shape[1] * self.frame_shape[2]
@ -212,10 +217,13 @@ class Camera:
self.capture_thread.start() self.capture_thread.start()
def start_ffmpeg(self): def start_ffmpeg(self):
if self.ffmpeg_log_level == None:
self.ffmpeg_log_level = 'panic'
ffmpeg_global_args = [ ffmpeg_global_args = [
'-hide_banner', '-loglevel', 'panic' '-hide_banner', '-loglevel', self.ffmpeg_log_level
] ]
ffmpeg_input_args = [ if self.ffmpeg_input_args == None:
self.ffmpeg_input_args = [
'-avoid_negative_ts', 'make_zero', '-avoid_negative_ts', 'make_zero',
'-fflags', 'nobuffer', '-fflags', 'nobuffer',
'-flags', 'low_delay', '-flags', 'low_delay',
@ -225,18 +233,22 @@ class Camera:
'-stimeout', '5000000', '-stimeout', '5000000',
'-use_wallclock_as_timestamps', '1' '-use_wallclock_as_timestamps', '1'
] ]
if self.ffmpeg_output_args == None:
self.ffmpeg_output_args = [
'-f', 'rawvideo',
'-pix_fmt', 'rgb24'
]
ffmpeg_cmd = (['ffmpeg'] + ffmpeg_cmd = (['ffmpeg'] +
ffmpeg_global_args + ffmpeg_global_args +
self.ffmpeg_hwaccel_args + self.ffmpeg_hwaccel_args +
ffmpeg_input_args + self.ffmpeg_input_args +
['-i', self.rtsp_url, ['-i', self.rtsp_url] +
'-f', 'rawvideo', self.ffmpeg_output_args +
'-pix_fmt', 'rgb24', ['pipe:'])
'pipe:'])
ffmpeg_cmd = list(map(str, ffmpeg_cmd))
print("".join(ffmpeg_cmd)) print("".join(ffmpeg_cmd))
self.ffmpeg_process = sp.Popen(ffmpeg_cmd, stdout = sp.PIPE, bufsize=self.frame_size) self.ffmpeg_process = sp.Popen(ffmpeg_cmd, stdout = sp.PIPE, bufsize=self.frame_size)
def start(self): def start(self):