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
相关产品推荐
相关产品推荐

