qt+opencv rtsp
时间: 2025-03-19 18:16:00 浏览: 37
### 使用 Qt 和 OpenCV 实现 RTSP 流的读取与显示
要通过 Qt 和 OpenCV 来实现 RTSP 流的读取与显示,可以按照以下方法完成:
#### 1. 编译并配置 OpenCV 支持 FFmpeg
为了能够成功读取 RTSP 流数据,需要确保在编译 OpenCV 的时候启用了 `FFMPEG` 功能。这可以通过 CMake 构建工具来实现,具体参数如下:
```bash
cmake -D WITH_FFMPEG=ON ..
```
此选项会在 OpenCV 中集成 FFmpeg 库的支持,从而允许其解析复杂的音视频流协议[^1]。
#### 2. 创建 Qt 工程并初始化界面
创建一个新的 Qt Widgets Application 并设计窗口布局。假设我们有一个 QLabel 控件用于显示视频帧,则可以在构造函数中进行必要的初始化工作。
以下是 MainWin 类的部分代码片段展示如何加载 RTSP 地址以及获取 FPS 参数:
```cpp
#include "ui_MainWin.h"
#include <QTimer>
#include <QDebug>
MainWin::MainWin(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWin)
{
ui->setupUi(this);
// 初始化 VideoCapture 对象
this->video = cv::VideoCapture("rtsp://admin:[email protected]:554/h264/ch1/sub/av_stream");
if (!this->video.isOpened()) {
qCritical() << "Failed to open the RTSP stream!";
return;
}
// 获取帧率
double rate = this->video.get(cv::CAP_PROP_FPS);
qDebug() << "Frame Rate:" << rate;
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), SLOT(update_frame()));
timer->start(1000 / rate); // 设置定时器间隔时间等于帧周期
}
```
上述代码实现了以下几个功能点:
- 调用 `cv::VideoCapture()` 方法传入 RTSP URL 进行连接测试。
- 如果未能正常开启资源则打印错误日志退出程序运行逻辑。
- 利用 `get(CAP_PROP_FPS)` 函数提取当前输入源的实际刷新频率作为后续更新画面的时间依据[^2]。
#### 3. 定义槽函数以持续抓取图像帧
定义一个名为 `update_frame` 的私有成员函数用来定期捕获最新的一帧图片并通过 QImage 显示出来:
```cpp
void MainWin::update_frame()
{
cv::Mat frame;
bool ret = this->video.read(frame);
if (ret && !frame.empty())
{
cv::cvtColor(frame, frame, CV_BGR2RGB);
QImage img((const uchar*)frame.data,
frame.cols,
frame.rows,
static_cast<int>(frame.step),
QImage::Format_RGB888);
QPixmap pixmap = QPixmap::fromImage(img.scaled(ui->label->size(), Qt::KeepAspectRatio));
ui->label->setPixmap(pixmap);
}
else
{
qWarning() << "No more frames or invalid capture.";
}
}
```
这里需要注意的是由于默认情况下 OpenCV 处理的颜色空间为 BGR ,而 Qt 所使用的则是 RGB 模型所以必须先调用 `cv::cvtColor()` 将色彩通道顺序转换过来再交给 QImage 去渲染^。
另外考虑到实际应用场景下可能会遇到短暂性的网络波动造成丢包现象进而影响到整个系统的稳定性因此有必要加入异常恢复机制即当检测到失败状态时尝试重新建立链接直到恢复正常为止[^3]:
```cpp
if(!ret || frame.empty()){
while(!(this->video.open("rtsp://..."))){
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
```
以上就是完整的基于 Qt 和 OpenCV 的 RTSP 视频流播放解决方案概述。
阅读全文
相关推荐


















