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:
Nicolas Mowen 2023-06-17 08:56:00 -06:00 committed by GitHub
parent 0996883a98
commit 2be2050d57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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