mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-01-16 00:09:14 +01:00
Don't fail to save segment when cv2 fails (#6823)
* Don't fail when cv2 fails * Clean up exception handling
This commit is contained in:
parent
0996883a98
commit
2be2050d57
@ -1147,35 +1147,19 @@ def to_relative_box(
|
|||||||
|
|
||||||
|
|
||||||
def get_video_properties(url, get_duration=False):
|
def get_video_properties(url, get_duration=False):
|
||||||
width = height = 0
|
def calculate_duration(video: Optional[any]) -> float:
|
||||||
# Open the video stream
|
duration = None
|
||||||
video = cv2.VideoCapture(url)
|
|
||||||
|
|
||||||
# Check if the video stream was opened successfully
|
if video is not None:
|
||||||
if not video.isOpened():
|
# Get the frames per second (fps) of the video stream
|
||||||
logger.debug(f"Error opening video stream {url}.")
|
fps = video.get(cv2.CAP_PROP_FPS)
|
||||||
return None
|
total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||||
|
|
||||||
# Get the width of frames in the video stream
|
if fps and total_frames:
|
||||||
width = video.get(cv2.CAP_PROP_FRAME_WIDTH)
|
duration = total_frames / fps
|
||||||
|
|
||||||
# Get the height of frames in the video stream
|
# if cv2 failed need to use ffprobe
|
||||||
height = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
if duration is None:
|
||||||
|
|
||||||
# Release the video stream
|
|
||||||
video.release()
|
|
||||||
|
|
||||||
result = {"width": round(width), "height": round(height)}
|
|
||||||
|
|
||||||
if get_duration:
|
|
||||||
# Get the frames per second (fps) of the video stream
|
|
||||||
fps = video.get(cv2.CAP_PROP_FPS)
|
|
||||||
total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
||||||
|
|
||||||
if fps and total_frames:
|
|
||||||
duration = total_frames / fps
|
|
||||||
else:
|
|
||||||
# if cv2 failed need to use ffprobe
|
|
||||||
ffprobe_cmd = [
|
ffprobe_cmd = [
|
||||||
"ffprobe",
|
"ffprobe",
|
||||||
"-v",
|
"-v",
|
||||||
@ -1187,11 +1171,41 @@ def get_video_properties(url, get_duration=False):
|
|||||||
f"{url}",
|
f"{url}",
|
||||||
]
|
]
|
||||||
p = sp.run(ffprobe_cmd, capture_output=True)
|
p = sp.run(ffprobe_cmd, capture_output=True)
|
||||||
|
|
||||||
if p.returncode == 0 and p.stdout.decode():
|
if p.returncode == 0 and p.stdout.decode():
|
||||||
duration = float(p.stdout.decode().strip())
|
duration = float(p.stdout.decode().strip())
|
||||||
else:
|
else:
|
||||||
duration = -1
|
duration = -1
|
||||||
|
|
||||||
result["duration"] = duration
|
return duration
|
||||||
|
|
||||||
|
width = height = 0
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Open the video stream
|
||||||
|
video = cv2.VideoCapture(url)
|
||||||
|
|
||||||
|
# Check if the video stream was opened successfully
|
||||||
|
if not video.isOpened():
|
||||||
|
video = None
|
||||||
|
except Exception:
|
||||||
|
video = None
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
|
||||||
|
if get_duration:
|
||||||
|
result["duration"] = calculate_duration(video)
|
||||||
|
|
||||||
|
if video is not None:
|
||||||
|
# Get the width of frames in the video stream
|
||||||
|
width = video.get(cv2.CAP_PROP_FRAME_WIDTH)
|
||||||
|
|
||||||
|
# Get the height of frames in the video stream
|
||||||
|
height = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
||||||
|
|
||||||
|
# Release the video stream
|
||||||
|
video.release()
|
||||||
|
|
||||||
|
result = {"width": round(width), "height": round(height)}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
Loading…
Reference in New Issue
Block a user