diff --git a/src/global.cpp b/src/global.cpp index 7c77b18..6a689e0 100644 --- a/src/global.cpp +++ b/src/global.cpp @@ -1,5 +1,7 @@ #include "global.h" +// bool g_videoPlayStatus[5]; + QSettings* g_networkSettingInfo; PullStreamInfoStruct g_pullStreamInfoStruct; diff --git a/src/global.h b/src/global.h index 0323079..707839d 100644 --- a/src/global.h +++ b/src/global.h @@ -34,6 +34,8 @@ struct PushStreamInfoStruct { QString pushStreamIP; }; +// extern bool g_videoPlayStatus[5]; + extern QSettings* g_networkSettingInfo; extern PullStreamInfoStruct g_pullStreamInfoStruct; @@ -48,12 +50,7 @@ extern bool isValidIPAddress(const QString& ip); extern bool isMulticastAddress(const QString& ip); -// enum NotificationType { -// NOTIFICATION_INFORMATION = 0, -// NOTIFICATION_SUCCESS = 1, -// NOTIFICATION_ERROR = 2, -// NOTIFICATION_WARNING = 3 -// }; +enum NotifyType { INFORMATION = 0, SUCCESS = 1, ERROR = 2, WARNING = 3 }; /** * @brief calCRC16 diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 07cd481..a278514 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -112,9 +112,14 @@ void MainWindow::initSignalConnection() { connect(&streamAddrSettingsDlg, &StreamAddrSettingsDlg::startPushStreamSignal, this, &MainWindow::pushStreamSlot); + + connect(ui->videoControlWidget, &VideoControl::stopVideoSignal, this, + &MainWindow::closeVideoSlot); } void MainWindow::initNotifyMessageConnection() { + connect(this, &MainWindow::sendErrorMessage, this, + &MainWindow::showMessageSlots); connect(ui->videoWidget, &VideoWidget::sendErrorMessageSignal, this, &MainWindow::showMessageSlots); connect(ui->commandWidget, &CommandWidget::sendErrorMessage, this, @@ -326,27 +331,57 @@ void MainWindow::openSavedVideoDirSlot() { void MainWindow::pullStreamSlot(bool bPull) { if (!g_networkSettingInfo) return; if (bPull) { - QString podPullStreamIP = - g_networkSettingInfo->value("NetworkStreamSettings/podPullAddress") - .toString(); - QString pullStreamIP1 = - g_networkSettingInfo->value("NetworkStreamSettings/pullAddress1") - .toString(); - QString pullStreamIP2 = - g_networkSettingInfo->value("NetworkStreamSettings/pullAddress2") - .toString(); - QString pullStreamIP3 = - g_networkSettingInfo->value("NetworkStreamSettings/pullAddress3") - .toString(); - QString pullStreamIP4 = - g_networkSettingInfo->value("NetworkStreamSettings/pullAddress4") - .toString(); - - ui->videoWidget->play(g_pullStreamInfoStruct.podPullIP); - ui->videoWidget1->play(g_pullStreamInfoStruct.pullIP1); - ui->videoWidget2->play(g_pullStreamInfoStruct.pullIP2); - ui->videoWidget3->play(g_pullStreamInfoStruct.pullIP3); - ui->videoWidget4->play(g_pullStreamInfoStruct.pullIP4); + // QString podPullStreamIP = + // g_networkSettingInfo->value("NetworkStreamSettings/podPullAddress") + // .toString(); + // QString pullStreamIP1 = + // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress1") + // .toString(); + // QString pullStreamIP2 = + // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress2") + // .toString(); + // QString pullStreamIP3 = + // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress3") + // .toString(); + // QString pullStreamIP4 = + // g_networkSettingInfo->value("NetworkStreamSettings/pullAddress4") + // .toString(); + + if (!ui->videoWidget->getPlayStatus()) { + ui->videoWidget->play(g_pullStreamInfoStruct.podPullIP); + } else { + emit sendErrorMessage("吊舱视频正在播放,请先暂停!", + NotifyType::WARNING); + } + + if (!ui->videoWidget1->getPlayStatus()) { + ui->videoWidget1->play(g_pullStreamInfoStruct.pullIP1); + } else { + emit sendErrorMessage("备用视频1正在播放,请先暂停!", + NotifyType::WARNING); + } + + if (!ui->videoWidget2->getPlayStatus()) { + ui->videoWidget2->play(g_pullStreamInfoStruct.pullIP2); + } else { + emit sendErrorMessage("备用视频2正在播放,请先暂停!", + NotifyType::WARNING); + } + + if (!ui->videoWidget3->getPlayStatus()) { + ui->videoWidget3->play(g_pullStreamInfoStruct.pullIP3); + } else { + emit sendErrorMessage("备用视频3正在播放,请先暂停!", + NotifyType::WARNING); + } + + if (!ui->videoWidget4->getPlayStatus()) { + ui->videoWidget4->play(g_pullStreamInfoStruct.pullIP4); + } else { + emit sendErrorMessage("备用视频4正在播放,请先暂停!", + NotifyType::WARNING); + } + } else { ui->videoWidget->stopPlay(); ui->videoWidget1->stopPlay(); @@ -398,3 +433,13 @@ void MainWindow::pushStreamSlot(bool bPush) { // ui->videoWidget4->stopPushStream(); } } + +void MainWindow::closeVideoSlot() { + ui->videoWidget->stopPlay(); + ui->videoWidget1->stopPlay(); + ui->videoWidget2->stopPlay(); + ui->videoWidget3->stopPlay(); + ui->videoWidget4->stopPlay(); + + emit sendErrorMessage("视频流已关闭!", NotifyType::SUCCESS); +} diff --git a/src/mainwindow.h b/src/mainwindow.h index aad63ea..9b96906 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -50,6 +50,7 @@ protected: void paintEvent(QPaintEvent *ev) override; signals: void themeChanged(); + void sendErrorMessage(QString message, int type); private: void initSignalConnection(); @@ -64,6 +65,7 @@ private: void setSavedVideoDir(); void initHideButton(); + private slots: void showSettingDlgSlot(); void showStreamSettingsDlgSlot(); @@ -73,6 +75,8 @@ private slots: void pullStreamSlot(bool bPull); void pushStreamSlot(bool bPush); + void closeVideoSlot(); + private: Ui::MainWindow *ui; VideoWidget *videoWidget1 = nullptr; diff --git a/src/video/readstream.cpp b/src/video/readstream.cpp index 9fc77c7..6fa344b 100644 --- a/src/video/readstream.cpp +++ b/src/video/readstream.cpp @@ -12,6 +12,10 @@ ReadStream::~ReadStream() { udpSocket->abort(); udpSocket->deleteLater(); } + + if (m_saveFile.isOpen()) { + m_saveFile.close(); + } } bool ReadStream::openFile(const QString &url) { @@ -187,6 +191,19 @@ bool ReadStream::initSocket(QString ip, int port) { } } +bool ReadStream::initSavedRawFile(QString fileDir, QString uavName) { + QDir dir; + if (!dir.exists(fileDir)) { + dir.mkdir(fileDir); + } + QString strName = QString("%1.dat").arg( + QDateTime::currentDateTime().toString("yyyyMMddHHmmss")); + QString filename = fileDir + "/" + uavName + "_" + strName; + m_saveFile.setFileName(filename); + bool bOopen = m_saveFile.open(QIODevice::WriteOnly | QIODevice::Append); + return bOopen; +} + void ReadStream::startPullStream() { // 如果没有打开则返回 if (!m_formatContext) { @@ -260,6 +277,8 @@ void ReadStream::startPullUDPStream() { return; } + initSavedRawFile(); + const AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264); codec_ctx = avcodec_alloc_context3(codec); codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P; @@ -282,6 +301,10 @@ void ReadStream::closeUDPConnectionSLot() { delete udpSocket; udpSocket = nullptr; } + + if (m_saveFile.isOpen()) { + m_saveFile.close(); + } } void ReadStream::initFFmpeg() { @@ -430,6 +453,11 @@ void ReadStream::udpDataReceivedSlot() { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); udpSocket->readDatagram(datagram.data(), datagram.size()); + // 保存原始数据 + if (m_saveFile.isOpen()) { + m_saveFile.write(datagram.toHex()); + } + if (static_cast<uint8_t>(datagram.at(0)) == 0xEB && static_cast<uint8_t>(datagram[1]) == 0x90 && static_cast<uint8_t>(datagram[4]) == 0xD5) { diff --git a/src/video/readstream.h b/src/video/readstream.h index 2e5a2b1..bf9495b 100644 --- a/src/video/readstream.h +++ b/src/video/readstream.h @@ -2,6 +2,7 @@ #define READSTREAM_H #include <QDebug> +#include <QFile> #include <QMutex> #include <QObject> #include <QQueue> @@ -29,6 +30,8 @@ public: void setUDPParms(QString ip, int port); bool initSocket(QString ip, int port); + + bool initSavedRawFile(QString fileDir = "./dat", QString uavName = "fp98"); public slots: void startPullStream(); void startPullUDPStream(); @@ -89,6 +92,7 @@ private: AVPacketQueueManager m_queueManager; private: + QFile m_saveFile; QUdpSocket *udpSocket = nullptr; QString m_UDPIP; int m_UDPPort; diff --git a/src/video/videowidget.cpp b/src/video/videowidget.cpp index bb00d9e..62cf737 100644 --- a/src/video/videowidget.cpp +++ b/src/video/videowidget.cpp @@ -52,7 +52,7 @@ VideoWidget::~VideoWidget() { } bool VideoWidget::play(const QString &url) { - // if (url.isEmpty()) return; + if (url.isEmpty()) return false; if (!m_pullFlag) { m_pullFlag = pullStream(url); if (!m_pullFlag) { @@ -215,6 +215,10 @@ void VideoWidget::setVedioSaveFileDirPath(const QString &dirPath) { m_videoSaveDirPath = dirPath; } +bool VideoWidget::getPlayStatus() { + return this->m_playFlag; +} + void VideoWidget::repaint(AVFrame *frame) { try { QMutexLocker locker(&m_mutex); diff --git a/src/video/videowidget.h b/src/video/videowidget.h index 8da4757..25f1068 100644 --- a/src/video/videowidget.h +++ b/src/video/videowidget.h @@ -46,12 +46,12 @@ public: bool play(const QString &url); bool udpPlay(QString ip, int port); void stopPlay(); - // void stopUDPPlay(); bool pushStream(const QString &url); void stopPushStream(); void setPullURL(const QString &url); void setPushURL(const QString &url); void setVedioSaveFileDirPath(const QString &dirPath); + bool getPlayStatus(); protected: void initializeGL() override; // 初始化gl diff --git a/src/videoControl.cpp b/src/videoControl.cpp index f6fa3d1..913ebe7 100644 --- a/src/videoControl.cpp +++ b/src/videoControl.cpp @@ -115,3 +115,10 @@ void VideoControl::on_pbPlayer_clicked() { ui->pbPlayer->setDisabled(false); } + +// 停止 +void VideoControl::on_pbStop_clicked() { + ui->pbStop->setDisabled(true); + emit stopVideoSignal(); + ui->pbStop->setDisabled(false); +} diff --git a/src/videoControl.h b/src/videoControl.h index 268f989..ff826b6 100644 --- a/src/videoControl.h +++ b/src/videoControl.h @@ -23,6 +23,8 @@ signals: void stopConnectionSignal(); void sendErrorMessage(QString message, int type); void changeVideoLayout(int index); + + void stopVideoSignal(); private slots: void receiveMessageSlots(QString message, int type); @@ -32,6 +34,8 @@ private slots: void on_pbPlayer_clicked(); + void on_pbStop_clicked(); + private: Ui::VideoControl *ui;