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

Python-OpenCV无法读取RTSP视频流问题求助

解决OpenCV无法读取RTSP流的问题

问题概述

使用VLC和FFmpeg命令行可正常打开RTSP流,但OpenCV报错OpenCV: Couldn't read video stream from file "rtsp://admin:admin123456@192.168.15.2:8554/profile0 ",本地MP4视频可正常读取。

解决方案

1. 检查RTSP链接格式

确保链接没有多余空格,错误信息中链接末尾带有空格,先确认代码中的链接字符串是否存在空格,修正为:

cap = cv2.VideoCapture("rtsp://admin:admin123456@192.168.15.2:8554/profile0")

2. 正确设置RTSP传输协议与FFmpeg参数

放弃通过环境变量设置,直接在VideoCapture初始化时指定FFmpeg后端,并设置传输协议:

import cv2

# 指定使用FFmpeg后端,同时设置RTSP传输为TCP(UDP不稳定时切换)
cap = cv2.VideoCapture("rtsp://admin:admin123456@192.168.15.2:8554/profile0", cv2.CAP_FFMPEG)
cap.set(cv2.CAP_PROP_FFMPEG_OPTION, 'rtsp_transport', 'tcp')

# 可选:设置超时与缓冲
cap.set(cv2.CAP_PROP_FFMPEG_OPTION, 'stimeout', '5000000')  # 5秒超时(单位微秒)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 2)  # 降低缓冲减少延迟

if not cap.isOpened():
    print('Cannot open RTSP stream')
    exit(-1)

while True:
    success, img = cap.read()
    if not success:
        print('Failed to read frame')
        break
    cv2.imshow('RTSP stream', img)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        cap.release()
        break

cv2.destroyAllWindows()

3. 验证OpenCV的FFmpeg支持

运行以下代码检查OpenCV是否编译了FFmpeg支持:

print(cv2.getBuildInformation())

在输出中查找FFmpeg项,确保标记为YES。如果是NO,需要重新安装带FFmpeg支持的OpenCV,比如使用pip install opencv-contrib-python,或从源码编译时启用FFmpeg选项。

4. 绕过OpenCV直接调用FFmpeg(备选方案)

如果上述方法无效,通过subprocess调用FFmpeg将RTSP流转为原始视频流,再用OpenCV读取:

import cv2
import subprocess
import numpy as np

# 替换为你的摄像头实际分辨率(宽x高)
WIDTH = 640
HEIGHT = 480

command = [
    'ffmpeg',
    '-rtsp_transport', 'tcp',
    '-i', 'rtsp://admin:admin123456@192.168.15.2:8554/profile0',
    '-f', 'rawvideo',
    '-pix_fmt', 'bgr24',
    '-vcodec', 'rawvideo',
    '-'
]

pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10**8)

while True:
    # 读取一帧原始数据
    raw_frame = pipe.stdout.read(WIDTH * HEIGHT * 3)
    if not raw_frame:
        break
    # 转换为OpenCV格式的帧
    frame = np.frombuffer(raw_frame, dtype=np.uint8).reshape((HEIGHT, WIDTH, 3))
    cv2.imshow('RTSP Stream', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

pipe.terminate()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:45:33