使用OpenCV读取RTSP视频流4秒后无法获取帧的解决方法
解决OpenCV读取RTSP流几秒后断连的问题
以下是几个实用的解决方法,按优先级尝试:
1. 修复代码循环结构,确保持续读取
你的代码只执行了一次video.read(),且缩进存在错误,应该把读取逻辑放到循环里,同时增加帧读取失败后的自动重连逻辑:
import cv2 import os from setup import config, load_model os.environ['OPENCV_FFMPEG_CAPTURE_OPTIONS'] = 'rtsp_transport;udp' video_name = "rtsp://sfkhikvision:Summer2023@192.168.1.230:554/Streaming/Channels/1" def init_rtsp_stream(): # 创建VideoCapture对象并设置缓冲区大小 cap = cv2.VideoCapture(video_name, cv2.CAP_FFMPEG) cap.set(cv2.CAP_PROP_BUFFERSIZE, 2) return cap # 初始化流连接 cap = init_rtsp_stream() while True: ret, frame = cap.read() if ret: frame_resized = cv2.resize(frame, (416, 416)) # 此处可添加你的预测、显示等业务逻辑 # 示例:cv2.imshow('RTSP Stream', frame_resized) # if cv2.waitKey(1) & 0xFF == ord('q'): # break else: # 读取失败时释放旧连接并重新初始化 print("流断开,正在重连...") cap.release() cap = init_rtsp_stream() continue # 程序结束时清理资源 cap.release() cv2.destroyAllWindows()
2. 切换传输协议为TCP
UDP容易因丢包导致断流,换成TCP传输通常更稳定:
# 替换原环境变量设置 os.environ['OPENCV_FFMPEG_CAPTURE_OPTIONS'] = 'rtsp_transport;tcp'
或者直接在RTSP地址后追加协议参数:
video_name = "rtsp://sfkhikvision:Summer2023@192.168.1.230:554/Streaming/Channels/1?transportmode=unicast&protocol=tcp"
3. 设置FFmpeg稳定参数
通过cv2.VideoCapture的set方法添加超时、帧率匹配等参数,提升流的稳定性:
cap = cv2.VideoCapture(video_name, cv2.CAP_FFMPEG) # 设置连接和读取超时(单位:毫秒) cap.set(cv2.CAP_PROP_OPEN_TIMEOUT_MSEC, 5000) cap.set(cv2.CAP_PROP_READ_TIMEOUT_MSEC, 5000) # 设置帧率与摄像头输出匹配 cap.set(cv2.CAP_PROP_FPS, 25)
4. 排查网络与摄像头配置
- 检查摄像头所在网络的稳定性,避免频繁丢包
- 登录摄像头后台,降低流的码率、帧率,减少传输压力
- 关闭摄像头内置的流超时自动断开功能(若有)
内容的提问来源于stack exchange,提问作者Happy Smile
相关产品推荐
相关产品推荐

