使用OpenCV与C++获取IP摄像头RTSP流失败求助
解决OpenCV C++无法打开IP摄像头RTSP流的问题
嘿,我来帮你搞定这个RTSP流打不开的问题!结合你说的情况——本地摄像头能正常用,VLC和Python也能连这个IP摄像头,那问题大概率出在OpenCV C++的配置或者代码细节上,咱们一步步来排查:
1. 先把代码里的基础问题修复
你的代码里有几个小细节容易被忽略,先调整一下:
- 直接用
cout但没加std::前缀,或者没声明using namespace std;,这会导致编译报错; - 旧版的
CV_WINDOW_AUTOSIZE在新版OpenCV里已经被弃用,换成WINDOW_AUTOSIZE; - 死循环
continue不太友好,改成尝试重新打开流加个小延迟; - 读取帧的时候最好判断是否成功,避免崩溃。
调整后的代码:
#include <stdio.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> #include <iostream> using namespace std; int main(int, char**) { // 尝试打开RTSP流 VideoCapture cap("rtsp://admin:admin@10.11.18.185:554/cam/realmonitor?channel=1&subtype=0"); // 循环检查是否打开成功,失败则重试 while (!cap.isOpened()) { cout << "Failed to open stream, retrying..." << endl; waitKey(500); // 延迟500ms再重试,避免疯狂刷屏 cap.open("rtsp://admin:admin@10.11.18.185:554/cam/realmonitor?channel=1&subtype=0"); } Mat frame; namedWindow("MyVideo", WINDOW_AUTOSIZE); while (true) { bool isFrameRead = cap.read(frame); if (!isFrameRead) { cout << "Lost connection to stream, exiting..." << endl; break; } imshow("MyVideo", frame); // 按下ESC键退出 if (waitKey(30) == 27) { cout << "ESC key pressed, exiting..." << endl; break; } } // 清理窗口 destroyAllWindows(); return 0; }
2. 强制指定FFmpeg后端
OpenCV的VideoCapture默认会自动选择后端,但对某些RTSP流的支持不够友好。既然VLC和Python能正常访问,说明FFmpeg解码没问题,咱们直接强制OpenCV用FFmpeg后端:
修改打开流的代码,直接指定后端:
VideoCapture cap("rtsp://admin:admin@10.11.18.185:554/cam/realmonitor?channel=1&subtype=0", CAP_FFMPEG);
或者在打开前设置编码格式(有些摄像头需要强制MJPEG编码才能被识别):
cap.set(CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G')); cap.open("rtsp://admin:admin@10.11.18.185:554/cam/realmonitor?channel=1&subtype=0", CAP_FFMPEG);
3. 检查OpenCV是否编译了FFmpeg支持
如果上面的方法还是不行,可能你的OpenCV编译时没启用FFmpeg支持。你可以加一段代码检查:
cout << "OpenCV Version: " << CV_VERSION << endl; cout << "FFmpeg Support: " << (cv::haveImageReader("rtsp://") ? "Enabled" : "Disabled") << endl;
如果输出显示FFmpeg Support是Disabled,那你需要重新编译OpenCV,在编译配置里勾选WITH_FFMPEG选项(用CMake的时候记得选上)。
4. 试试调整RTSP流的参数
有些IP摄像头的主流码率太高,OpenCV处理起来有压力,你可以试试切换到子流(一般subtype=1):
VideoCapture cap("rtsp://admin:admin@10.11.18.185:554/cam/realmonitor?channel=1&subtype=1", CAP_FFMPEG);
或者手动设置分辨率和帧率:
cap.set(CAP_PROP_FRAME_WIDTH, 640); cap.set(CAP_PROP_FRAME_HEIGHT, 480); cap.set(CAP_PROP_FPS, 15);
5. 最后检查网络和摄像头设置
确保你的电脑和IP摄像头在同一个局域网,554端口没有被防火墙拦截;另外,登录摄像头的Web管理界面,确认RTSP服务已经开启,账号密码没有错误(你用的admin/admin没问题的话就忽略)。
按照这些步骤来,应该就能解决你无法打开RTSP流的问题啦!
内容的提问来源于stack exchange,提问作者Hammad Ali Butt




