python - 如果由于 RTSP 摄像头问题导致执行停止,如何终止 cv2.VideoCapture(rtsp_url) 调用?
问题描述
我有 80 个摄像头的 RTSP URL。我正在尝试使用cv2.VideoCapture(rtsp_url)
. 我正在对从每个相机捕获的屏幕截图进行一些图像处理操作。每台相机我总共有 80 个这样的 URL。示例 RTSP URL 是:
rtsp://192.168.0.101:554/user=admin_password=oyXv12aW_channel=1_stream=0.sdp?real_stream
现在,有时由于网络或其他技术问题,某些摄像头暂时无法正常工作。在这种情况下cv2.VideoCapture(rtsp_url)
需要超过 30 秒才能返回。在正常情况下,通常需要 2-3 秒才能返回屏幕截图。但是,如果相机停机,则需要花费太多时间。由于我的应用程序for
在许多相机上循环运行,我不能等待。有时,不活动的相机数量很高,执行循环需要很长时间。可以做些什么来减少等待时间cv2.VideoCapture
?
如果进程超过给定的时间阈值,我也使用multiprocessing
并尝试终止进程。我不想使用它,multiprocessing
虽然它工作得很好。我想找到一个解决方案只使用opencv
解决方案
多处理版本可能真的是你想要的
- 可以简化并行读取所有相机
- 可以处理各种与超时相关的问题
然而,一点阅读表明 OpenCV RTSP 处理是由ffmpeg
内部完成的,其行为部分由名为的环境变量控制OPENCV_FFMPEG_CAPTURE_OPTIONS
来自 ffmpeg http://ffmpeg.org/ffmpeg-protocols.html#rtsp上的文档
timeout Set socket TCP I/O timeout in microseconds.
我没有实用的方法来尝试这个,但也许在你的程序中设置它或先导出它就是你所需要的
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "timeout;5000"
cam = cv2.VideoCapture("rtsp://YOUR_STREAMING_IP_ADDRESS:PORT/foo.sdp", cv2.CAP_FFMPEG)
推荐阅读
- php - PHP从另一台服务器执行nodejs
- spring-security - Spring open id connect中隐式模式的目的是什么?
- r - 在单个空间点进行克里金法?
- vb6 - VB6中的“需要对象”分配函数结果
- java - Java JaxB Unmarshaller 给出 org.xml.sax.SAXParseException 文件过早结束
- regex - 正则表达式 - 不能删除 @ 符号
- f# - Rider F# 控制台模板
- python - 无法在 Django 1.11.13 上安装 Django-Channel
- haskell - 带有案例分析的“输入解析错误”
- teradata - 选择 TOP 1000 + 自定义用户 ID