You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:13:24