capping ffmpeg stream error written
This commit is contained in:
1 parent
50752911db
commit
ea88e92c99
1 file changed
+29
@@ -7,6 +7,7 @@ Left / right rectangular zones mark the left and right sack feeders.
|
|||||||
A sack is counted once when its centroid enters a zone.
|
A sack is counted once when its centroid enters a zone.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import contextlib
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import cv2
|
import cv2
|
||||||
import csv
|
import csv
|
||||||
@@ -14,6 +15,7 @@ import json
|
|||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
import socket
|
import socket
|
||||||
|
import sys
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
from collections import deque
|
from collections import deque
|
||||||
@@ -923,9 +925,36 @@ def start_control_socket():
|
|||||||
return srv
|
return srv
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def _quiet_opencv_stderr():
|
||||||
|
"""Silence OpenCV/FFmpeg stderr (DESCRIBE failed, cap.cpp WARN, etc.)."""
|
||||||
|
saved_fd = None
|
||||||
|
devnull_fd = None
|
||||||
|
try:
|
||||||
|
stderr_fd = sys.stderr.fileno()
|
||||||
|
saved_fd = os.dup(stderr_fd)
|
||||||
|
devnull_fd = os.open(os.devnull, os.O_WRONLY)
|
||||||
|
os.dup2(devnull_fd, stderr_fd)
|
||||||
|
except (AttributeError, OSError, ValueError):
|
||||||
|
yield
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
os.dup2(saved_fd, stderr_fd)
|
||||||
|
os.close(saved_fd)
|
||||||
|
os.close(devnull_fd)
|
||||||
|
|
||||||
|
|
||||||
def open_capture(source):
|
def open_capture(source):
|
||||||
if source.lower().startswith(("rtsp://", "http://")):
|
if source.lower().startswith(("rtsp://", "http://")):
|
||||||
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = RTSP_FFMPEG_OPTIONS
|
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = RTSP_FFMPEG_OPTIONS
|
||||||
|
# When STREAM_ERROR_LOG_MAX > 0, native OpenCV/FFmpeg stderr is suppressed;
|
||||||
|
# stream_error_log emits at most that many user-facing messages per outage.
|
||||||
|
if STREAM_ERROR_LOG_MAX > 0:
|
||||||
|
with _quiet_opencv_stderr():
|
||||||
|
cap = cv2.VideoCapture(source, cv2.CAP_FFMPEG)
|
||||||
|
else:
|
||||||
cap = cv2.VideoCapture(source, cv2.CAP_FFMPEG)
|
cap = cv2.VideoCapture(source, cv2.CAP_FFMPEG)
|
||||||
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
|
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
|
||||||
return cap
|
return cap
|
||||||
|
|||||||
Reference in new issue
Block a user