OpenCV C++读取RTSP流时VideoCapture报Operation now in progress错误
问题解决方案
核心错误根因
你当前的代码首先存在环境变量参数格式错误:OPENCV_FFMPEG_CAPTURE_OPTIONS的键值对需要用=连接,不同参数之间才用;分隔,你原来写的rtsp_transport;udp属于无效配置,没有正确指定RTSP传输协议,导致FFMPEG后端握手超时失败。
分步解决方法
- 第一步:修正环境变量参数格式,优先测试TCP传输(UDP传输容易在局域网出现丢包、摄像头侧不兼容的问题,VLC/ffplay默认优先用TCP协商),修改为:
setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport=tcp", 1); - 第二步:OpenCV的
VideoCapture::open默认超时时间较短,可添加3~5次的重试逻辑,避免单次握手失败直接退出 - 第三步:如果上述修改仍无效,确认你的OpenCV版本:
- 3.x版本的FFMPEG后端对RTSP的支持存在大量已知bug,建议升级到4.5及以上的稳定版本
- 确认你编译OpenCV时开启了FFMPEG模块,且链接的FFMPEG库版本和你系统中可正常播放流的ffplay版本一致
- 补充说明:删除
cv::CAP_FFMPEG参数报错是正常现象,OpenCV原生后端不支持RTSP协议解析,必须指定FFMPEG作为后端才能拉取RTSP流
修改后可运行的代码示例
#include <iostream> #include <unistd.h> #include <opencv2/opencv.hpp> int main() { std::string window_name = "RGB Camera"; // 修正参数格式,使用TCP传输避免丢包/握手失败 setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport=tcp", 1); const std::string rtsp_url = "rtsp://192.168.2.100:5010/video.sdp"; cv::VideoCapture cap; int retry_cnt = 0; const int max_retry = 3; // 添加重试逻辑 while (retry_cnt < max_retry) { if (cap.open(rtsp_url, cv::CAP_FFMPEG)) { break; } std::cerr << "Open stream failed, retry " << retry_cnt + 1 << "/" << max_retry << std::endl; retry_cnt++; sleep(1); cap.release(); } if (!cap.isOpened()) { perror("Final Video Stream Error"); exit(EXIT_FAILURE); } cv::namedWindow(window_name, cv::WindowFlags::WINDOW_KEEPRATIO); cv::Mat frame; while (1) { const bool read_success = cap.read(frame); if (!read_success) { printf("End of stream\n."); break; } cv::imshow(window_name, frame); char c = (char)cv::waitKey(25); if (c == 27) { printf("Esc key pressed, terminating loop...\n"); break; } } cap.release(); cv::destroyAllWindows(); return 0; }
内容的提问来源于stack exchange,提问作者John Hal
相关产品推荐
相关产品推荐

