You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Conception/mjpg_streamer/无人机视频传输.txt

122 lines
2.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/core/mat.hpp>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_playButton_clicked();
void on_stopButton_clicked();
void readFrame();
private:
Ui::MainWindow *ui;
cv::VideoCapture mCapture; // Video capture object for reading RTSP stream
cv::Mat mFrame; // Mat object to store the video frame
bool mPlaying; // Flag to indicate if video playback is in progress
};
#endif // MAINWINDOW_H
mainwindow.cpp
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTimer>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Set up VideoCapture object for reading RTSP stream
//调节参数 取决于对视频流带宽要求以及本机性能 适点即可
mCapture.set(cv::CAP_PROP_BUFFERSIZE,5);
mCapture.open("rtsp://localhost:8554/unicast"); //修改RTSP地址
if (!mCapture.isOpened())
{
qCritical() << "Failed to open RTSP stream.";
return;
}
//初始化mFrame和mPlaying标记
mPlaying = false;
//设置Paly按钮为不可用状态
ui->playButton->setEnabled(true);
ui->stopButton->setEnabled(false);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_playButton_clicked()
{
if (!mPlaying)
{
mPlaying = true;
// 每20毫秒读取一帧并在QLabel显示该帧图像
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::readFrame);
timer->start(20);
//设置控件状态
ui->playButton->setEnabled(false);
ui->stopButton->setEnabled(true);
}
}
void MainWindow::readFrame()
{
if (mCapture.read(mFrame))
{
QImage frameImage((uchar*)mFrame.data, mFrame.cols, mFrame.rows, QImage::Format_RGB888);
QPixmap framePixmap = QPixmap::fromImage(frameImage.rgbSwapped());
// .rgbSwapped()因为OpenCV默认使用BGR而Qt使用RGB必须交换颜色通道才能正确地显示
ui->videoLabel->setPixmap(framePixmap.scaled(ui->videoLabel->size(), Qt::KeepAspectRatio));
}
}
void MainWindow::on_stopButton_clicked()
{
if (mPlaying)
{
mPlaying = false;
//停止计时器,断开信号/槽连接
QObject::disconnect(this, &MainWindow::readFrame, nullptr, nullptr);
//设置控件状态
ui->playButton->setEnabled(true);
ui->stopButton->setEnabled(false);
//清除QLabel
ui->videoLabel->clear();
}
}