OpenCV调用FFmpeg读取RTSP摄像头帧失败问题排查
RTSP摄像头无法通过OpenCV+FFmpeg打开的问题排查
环境信息
- 系统:Ubuntu 20.04
- Python版本:3.8
- OpenCV版本:4.5.2
- FFmpeg版本:4.2.7-0ubuntu0.1(终端执行
ffmpeg确认可正常运行) - OpenCV编译信息显示FFmpeg组件已启用:
Video I/O: DC1394: NO FFMPEG: YES avcodec: YES (58.54.100) avformat: YES (58.29.100) avutil: YES (56.31.100) swscale: YES (5.5.100) avresample: NO GStreamer: YES (1.16.2) v4l/v4l2: YES (linux/videodev2.h)
- 摄像头IP可通过浏览器正常访问
测试代码
import cv2 gst_out = "rtsp://admin:psw@IP:88/videoMain" cap = cv2.VideoCapture(gst_out, cv2.CAP_FFMPEG) while(cap.isOpened()): ret, frame = cap.read() print("New Frame") cv2.imshow('frame', frame) if cv2.waitKey(20) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
问题
脚本执行后cap始终无法打开,请求排查可能的原因。
可能的问题原因
- RTSP URL格式或权限问题:
- 确认用户名、密码、IP、端口、流路径(
videoMain)完全正确,部分摄像头的流路径可能为stream1或其他命名,可查看摄像头说明书或管理后台确认。 - 若密码包含特殊字符(如@、#、&等),需进行URL编码,比如
@替换为%40,否则会被解析为URL分隔符导致认证失败。
- 确认用户名、密码、IP、端口、流路径(
- OpenCV与FFmpeg版本兼容性:
- OpenCV 4.5.2依赖的FFmpeg组件版本(avcodec 58.54.100等)和系统安装的FFmpeg 4.2.7可能存在版本不匹配,尝试重新编译OpenCV并绑定系统当前的FFmpeg库。
- RTSP传输协议不兼容:
- 部分摄像头默认使用UDP传输,可能存在丢包或防火墙限制,可强制指定TCP传输,修改RTSP URL为
rtsp://admin:psw@IP:88/videoMain?tcp,或在代码中添加参数配置:cap = cv2.VideoCapture(gst_out, cv2.CAP_FFMPEG) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) cap.set(cv2.CAP_PROP_BUFFERSIZE, 10)
- 部分摄像头默认使用UDP传输,可能存在丢包或防火墙限制,可强制指定TCP传输,修改RTSP URL为
- FFmpeg直接测试流可用性:
- 用FFmpeg命令直接测试RTSP流是否可读,执行:
ffmpeg -i rtsp://admin:psw@IP:88/videoMain -f null -,若命令失败,根据报错信息排查(如认证失败、流不存在、网络问题);若命令正常运行,说明问题出在OpenCV的调用逻辑上。
- 用FFmpeg命令直接测试RTSP流是否可读,执行:
- 显示相关问题干扰判断:
- 在
cap = cv2.VideoCapture(...)后添加print(cap.isOpened()),确认是否真的无法打开捕获器,避免因cv2.imshow无法显示导致误解。 - 若通过SSH远程连接Ubuntu且未开启X11转发,
cv2.imshow会报错,可注释掉显示相关代码,仅打印ret值测试是否能读取帧。
- 在
- 防火墙或网络限制:
- 确认Ubuntu防火墙(ufw)未阻挡RTSP端口(此处为88),执行
sudo ufw allow 88/tcp和sudo ufw allow 88/udp开放端口。 - 确认摄像头与Ubuntu机器在同一局域网,跨网段时需检查路由是否正常,以及摄像头是否允许外部设备访问RTSP流。
- 确认Ubuntu防火墙(ufw)未阻挡RTSP端口(此处为88),执行
内容的提问来源于stack exchange,提问作者Paloma Jimeno
相关产品推荐
相关产品推荐

