You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动