Hello.
In our project we write several minutes length videos to RAM. Simplified code for recording video looks like this:
import datetime
import cv2
import time
def get_gstreamer_output_pipeline(video_file_name, path_to_video_folder):
return ('appsrc ! '
'video/x-raw, format=BGR ! '
'queue ! '
'videoconvert ! '
'video/x-raw,format=RGBA ! '
'nvvidconv ! '
'nvv4l2h264enc ! '
'h264parse ! '
'qtmux ! '
'filesink location=%s%s ' % (path_to_video_folder, video_file_name))
def main():
path_to_RAM_videos_folder = '/run/user/120/videos/'
gstreamer_pipeline = (
'nvarguscamerasrc exposuretimerange="33000000 33000000" gainrange="2 2" ispdigitalgainrange="4 4" wbmode=0 ! '
'video/x-raw(memory:NVMM), width=(int)1080, height=(int)720, format=(string)NV12, framerate=(fraction)30/1 ! '
'nvvidconv ! '
'video/x-raw, format=(string)BGRx ! '
'videoconvert ! '
'video/x-raw, format=(string)BGR ! '
'appsink')
video_capturer = cv2.VideoCapture(gstreamer_pipeline, cv2.CAP_GSTREAMER)
current_date = datetime.datetime.now()
video_name = current_date.strftime('%Y%m%d_%H%M%S.avi')
gst_out = get_gstreamer_output_pipeline(video_name, path_to_RAM_videos_folder)
out = cv2.VideoWriter(gst_out, cv2.CAP_GSTREAMER, 0, 30.0, (int(1080), int(720)))
while (video_capturer.isOpened()):
tic_1 = time.time()
if (datetime.datetime.now() - current_date).total_seconds() > N * 60:
out.release()
current_date = datetime.datetime.now()
video_name = current_date.strftime('%Y%m%d_%H%M%S.avi')
gst_out = get_gstreamer_output_pipeline(video_name, path_to_RAM_videos_folder)
out = cv2.VideoWriter(gst_out, cv2.CAP_GSTREAMER, 0, 30.0, (int(1080), int(720)))
toc_1 = time.time()
# Reading frame from camera:
tic_2 = time.time()
_, frame = video_capturer.read()
toc_2 = time.time()
tic_3 = time.time()
# Some code.
toc_3 = time.time()
# Writing frame to video file:
tic_4 = time.time()
out.write(frame)
toc_4 = time.time()
# Checking time delays:
if (toc_1 - tic_1 > 0.04 or
toc_2 - tic_2 > 0.04 or
toc_3 - tic_3 > 0.04 or
toc_4 - tic_4 > 0.04):
time_expenses = 'Main thread t1:' + str(round(toc_1 - tic_1, 4)) + \
'|t2:' + str(round(toc_2 - tic_2, 4)) + \
'|t3:' + str(round(toc_3 - tic_3, 4)) + \
'|t4:' + str(round(toc_4 - tic_4, 4))
# Writing to the log file:
logger_file.debug(time_expenses)
tic_1 = toc_1 = tic_2 = toc_2 = tic_3 = toc_3 = tic_4 = toc_4 = 0
The following lines rarely appear in the log file (1-2 times a day):
[2021-08-23 16:09:10] DEBUG Main thread t1:0.0647|t2:0.0009|t3:0.017|t4:0.0008
[2021-08-23 16:09:12] DEBUG Main thread t1:0.0|t2:0.0009|t3:0.021|t4:1.7238
t1 in first row is time spended for creating VideoWriter() object, this is normal. However, in the second line, there is a delay for recording the frame (t4). I. e., the first one or more frames after the object created are recorded in a short time, and the next frame delays the cycle for a few seconds. And such cases appeares 1-2 times a day.
The problem will not be repeated if I start recording short videos in isolation for a long time (without all application’s functional). Our python application takes 165/400% of CPU time and nvargus-daemon takes 20/400% CPU (output of “top” command).
How can we find reason of such delays and how to solve it? Thank you.