Răsfoiți Sursa

整理流程完善

zhuizhu 9 luni în urmă
părinte
comite
a943d7d628

+ 14 - 0
AvPlayer2/PlayWidget.cpp

@@ -16,6 +16,20 @@ PlayWidget::PlayWidget(QWidget* parent)
     setPlayerController(new PlayerController);
 }
 
+PlayWidget::~PlayWidget()
+{
+    if (m_playerController) {
+        delete m_playerController;
+    }
+}
+
+void PlayWidget::startToPlay(const QString& url)
+{
+    if (m_playerController) {
+        m_playerController->startToPlay(url);
+    }
+}
+
 void PlayWidget::setupUi()
 {
     m_videoWidget = std::make_unique<OpenGLVideoWidget>(this);

+ 3 - 0
AvPlayer2/PlayWidget.h

@@ -16,6 +16,9 @@ class PlayWidget : public QWidget
     Q_OBJECT
 public:
     explicit PlayWidget(QWidget* parent = nullptr);
+    ~PlayWidget();
+
+    void startToPlay(const QString& url);
 
 private:
     std::unique_ptr<OpenGLVideoWidget> m_videoWidget;

+ 11 - 0
AvRecorder/ui/av_recorder.cpp

@@ -38,6 +38,16 @@ AvRecorder::AvRecorder(QWidget* parent)
     setLayout(layout);
 }
 
+void AvRecorder::setSettings(const SettingsPage::Param& param)
+{
+    m_settingsParam.audioParam.bitRate = 160'000;
+    m_settingsParam.videoParam.bitRate = 8'000'000;
+    m_settingsParam.videoParam.fps = 30;
+    m_settingsParam.videoParam.name = Encoder<MediaType::VIDEO>::GetUsableEncoders().front();
+    m_settingsParam.outputDir = ".";
+    m_settingsParam.liveUrl = param.liveUrl;   // "rtmp://192.168.3.76:1935/stream/V1";
+    m_settingsParam.liveName = param.liveName; // "stream";
+}
 void AvRecorder::initConnect()
 {
     connect(m_recordBtn, &QPushButton::released, [this] {
@@ -64,6 +74,7 @@ void AvRecorder::initConnect()
         if (!m_isLive) {
             auto fileName = m_settingsParam.liveUrl + "/" + m_settingsParam.liveName;
             bool isRtsp = m_settingsParam.liveUrl.find("rtsp") != std::string::npos;
+            qDebug() << "直播地址:" << QString::fromStdString(fileName);
             __CheckNo(startStream(fileName, isRtsp ? "rtsp" : "flv"));
 
             // 如果勾选了同步录像,则开始录像

+ 2 - 0
AvRecorder/ui/av_recorder.h

@@ -26,6 +26,8 @@ public:
 
     QWidget* statusBar() const { return m_statusBar; }
 
+    void setSettings(const SettingsPage::Param& param);
+
 private:
     AudioRecorder m_audioRecorder;
     VideoRecorder m_videoRecorder;

+ 23 - 36
AvRecorder/ui/settings_page.cpp

@@ -1,8 +1,6 @@
-
-
 #include "settings_page.h"
-#include "encoder/video_encoder.h"
 #include <QFileDialog>
+#include "encoder/video_encoder.h"
 
 SettingsPage::SettingsPage(Param* param, QWidget* parent)
     : QDialog(parent)
@@ -15,13 +13,9 @@ SettingsPage::SettingsPage(Param* param, QWidget* parent)
 
 void SettingsPage::_InitConnect()
 {
-    connect(_applyBtn, &QPushButton::released, [this] {
-        _WriteSettings();
-    });
+    connect(_applyBtn, &QPushButton::released, [this] { _WriteSettings(); });
 
-    connect(_cancelBtn, &QPushButton::released, [this] {
-        this->close();
-    });
+    connect(_cancelBtn, &QPushButton::released, [this] { this->close(); });
 
     connect(_yesBtn, &QPushButton::released, [this] {
         _WriteSettings();
@@ -29,7 +23,10 @@ void SettingsPage::_InitConnect()
     });
 
     connect(_selDirBtn, &QPushButton::released, [this] {
-        QString selectedDir = QFileDialog::getExistingDirectory(this, "选择输出目录", "./", QFileDialog::ShowDirsOnly);
+        QString selectedDir = QFileDialog::getExistingDirectory(this,
+                                                                "选择输出目录",
+                                                                "./",
+                                                                QFileDialog::ShowDirsOnly);
         // 若目录路径不为空
         if (!selectedDir.isEmpty()) {
             // 显示选择的目录路径
@@ -45,8 +42,8 @@ void SettingsPage::_WriteSettings()
     _param->videoParam.name = _videoEncoderBox->currentText().toStdString();
     _param->audioParam.bitRate = _audioBitRateBox->value() * 1000;
     _param->outputDir = _fileDirEdit->text().toStdString();
-    _param->liveUrl = _liveUrlEdit->text().toStdString();
-    _param->liveName = _liveNameEdit->text().toStdString();
+    // _param->liveUrl = _liveUrlEdit->text().toStdString();
+    // _param->liveName = _liveNameEdit->text().toStdString();
 }
 
 void SettingsPage::_InitUi()
@@ -56,7 +53,6 @@ void SettingsPage::_InitUi()
     layout->addWidget(_InitVideoUi());
     layout->addWidget(_InitAudioUi());
     layout->addWidget(_InitOutputUi());
-    layout->addWidget(_InitLiveUi());
     auto hLayout = new QHBoxLayout;
     _applyBtn = new QPushButton("应用");
     _cancelBtn = new QPushButton("取消");
@@ -87,9 +83,14 @@ QGroupBox* SettingsPage::_InitVideoUi()
         _videoEncoderBox->addItem(encoder.c_str());
     }
     _videoEncoderBox->setCurrentText(_param->videoParam.name.c_str());
-    layout->addLayout(_CreateDescription("比特率(kB):", "越高的比特率越清晰, 但越占用硬件资源", _videoBitRateBox));
-    layout->addLayout(_CreateDescription("帧率:", "越高的帧率越流畅, 但越占用硬件资源", _videoFpsBox));
-    layout->addLayout(_CreateDescription("编码器:", "libx264 为软件编码, CPU占用高但兼容性强, 其他为硬件编码, 效果与软件编码相反", _videoEncoderBox));
+    layout->addLayout(
+        _CreateDescription("比特率(kB):", "越高的比特率越清晰, 但越占用硬件资源", _videoBitRateBox));
+    layout->addLayout(
+        _CreateDescription("帧率:", "越高的帧率越流畅, 但越占用硬件资源", _videoFpsBox));
+    layout->addLayout(_CreateDescription(
+        "编码器:",
+        "libx264 为软件编码, CPU占用高但兼容性强, 其他为硬件编码, 效果与软件编码相反",
+        _videoEncoderBox));
     groupBox->setLayout(layout);
     return groupBox;
 }
@@ -101,7 +102,8 @@ QGroupBox* SettingsPage::_InitAudioUi()
     _audioBitRateBox->setMinimum(0);
     _audioBitRateBox->setMaximum(INT_MAX);
     _audioBitRateBox->setValue(_param->audioParam.bitRate / 1000);
-    layout->addLayout(_CreateDescription("比特率(kB):", "越高的比特率越清晰, 但越占用硬件资源", _audioBitRateBox));
+    layout->addLayout(
+        _CreateDescription("比特率(kB):", "越高的比特率越清晰, 但越占用硬件资源", _audioBitRateBox));
     groupBox->setLayout(layout);
     return groupBox;
 }
@@ -118,24 +120,9 @@ QGroupBox* SettingsPage::_InitOutputUi()
     return groupBox;
 }
 
-QGroupBox* SettingsPage::_InitLiveUi()
-{
-    auto groupBox = new QGroupBox("直播");
-    auto layout = new QVBoxLayout;
-    _liveUrlEdit = new QLineEdit(_param->liveUrl.c_str());
-    _liveNameEdit = new QLineEdit(_param->liveName.c_str());
-    auto liveUrlLayout = new QHBoxLayout();
-    liveUrlLayout->addWidget(new QLabel("地址:"));
-    liveUrlLayout->addWidget(_liveUrlEdit);
-    auto liveNameLayout = new QHBoxLayout();
-    liveNameLayout->addWidget(new QLabel("名称(密钥):"));
-    liveNameLayout->addWidget(_liveNameEdit);
-    layout->addLayout(liveUrlLayout);
-    layout->addLayout(liveNameLayout);
-    groupBox->setLayout(layout);
-    return groupBox;
-}
-QHBoxLayout* SettingsPage::_CreateDescription(std::string_view text, std::string_view textEx, QWidget* widget)
+QHBoxLayout* SettingsPage::_CreateDescription(std::string_view text,
+                                              std::string_view textEx,
+                                              QWidget* widget)
 {
     auto layout = new QHBoxLayout;
     auto label = new QLabel(text.data());
@@ -143,4 +130,4 @@ QHBoxLayout* SettingsPage::_CreateDescription(std::string_view text, std::string
     layout->addWidget(label);
     layout->addWidget(widget);
     return layout;
-}
+}

+ 1 - 4
AvRecorder/ui/settings_page.h

@@ -30,15 +30,12 @@ private:
     QGroupBox* _InitVideoUi();
     QGroupBox* _InitAudioUi();
     QGroupBox* _InitOutputUi();
-    QGroupBox* _InitLiveUi();
     Param* _param = nullptr;
     QSpinBox* _videoBitRateBox = nullptr;
     QSpinBox* _videoFpsBox = nullptr;
     QComboBox* _videoEncoderBox = nullptr;
     QSpinBox* _audioBitRateBox = nullptr;
     QLineEdit* _fileDirEdit = nullptr;
-    QLineEdit* _liveUrlEdit = nullptr;
-    QLineEdit* _liveNameEdit = nullptr;
     QPushButton* _selDirBtn = nullptr;
     QPushButton* _applyBtn = nullptr;
     QPushButton* _cancelBtn = nullptr;
@@ -47,4 +44,4 @@ private:
     QHBoxLayout* _CreateDescription(std::string_view text, std::string_view textEx, QWidget* widget);
 };
 
-#endif
+#endif

+ 1 - 1
api/userapi.h

@@ -25,7 +25,7 @@ public:
 class UserInfo
 {
     Q_GADGET
-    Q_PROPERTY(QString id MEMBER id)
+    Q_PROPERTY(QString userId MEMBER id)
     Q_PROPERTY(QString username MEMBER username)
     Q_PROPERTY(QStringList roleName MEMBER roleName)
 

+ 11 - 0
appevent.cpp

@@ -56,6 +56,7 @@ public:
     bool enableRefreshToken;
 
     QStringList roles;
+    QString userId;
 };
 
 AppEvent::AppEvent(QObject *parent)
@@ -234,6 +235,16 @@ void AppEvent::setEnableRefreshToken(bool enable)
     }
 }
 
+void AppEvent::setUserId(const QString &id)
+{
+    d->userId = id;
+}
+
+QString AppEvent::userId() const
+{
+    return d->userId;
+}
+
 void AppEvent::setRoles(const QStringList &roles)
 {
     d->roles = roles;

+ 3 - 0
appevent.h

@@ -43,6 +43,9 @@ public:
     bool isEnableRefreshToken() const;
     void setEnableRefreshToken(bool enable);
 
+    void setUserId(const QString &id);
+    QString userId() const;
+
     void setRoles(const QStringList &roles);
     QStringList roles() const;
     bool hasRole(const QString &role);

+ 39 - 34
mainwindow.cpp

@@ -16,6 +16,7 @@
 #include "network/websocketclient.h"
 #include "qboxlayout.h"
 #include "qlistwidget.h"
+#include "qobject.h"
 #include "ui/av_recorder.h"
 #include "views/loginwindow.h"
 
@@ -195,8 +196,10 @@ void MainWindow::createMainWindow()
     // 退出处理
     connect(mainWidget->userProfile, &UserProfileWidget::logoutClicked, this, [this]() {
         AppEvent *appEvent = AppEvent::instance();
-        appEvent->setJwtToken(QString());
-        appEvent->setRefreshTime(0);
+        appEvent->setJwtToken(QString()); // 清理token
+        appEvent->setRefreshTime(0);      // 清理token刷新时间
+        appEvent->setRoles({});           // 清理角色
+        appEvent->setUserId({});          // 清理用户id
 
         if (mainWidget->userProfile) {
             stackedWidget->setCurrentWidget(loginWidget);
@@ -212,7 +215,22 @@ void MainWindow::createMainWindow()
 
                     // 重新进入房间
                     mainWidget->chatView->initWebsocket(id);
+                    if (!mainWidget->playerWidget) {
+                        return;
+                    }
+                    // 推流配置
+                    if (AvRecorder *avRecorder = qobject_cast<AvRecorder *>(
+                            mainWidget->playerWidget)) {
+                        SettingsPage::Param param;
+                        param.liveUrl = "rtmp://192.168.3.76:1935/stream/V1";
+                        param.liveName = id.toStdString();
+                        avRecorder->setSettings(param);
+                    }
                     // 拉取视频流程
+                    if (PlayWidget *playWidget = qobject_cast<PlayWidget *>(
+                            mainWidget->playerWidget)) {
+                        playWidget->startToPlay("rtmp://192.168.3.76:1935/stream/V1/" + id);
+                    }
                 }
             });
 }
@@ -224,32 +242,6 @@ void MainWindow::onLoginSuccess(const QString &username, const QString &password
     loginParams.username = username;
     loginParams.password = password;
 
-    // 使用链式调用处理异步请求
-    // AsyncHelper::http(AuthApi::loginApi(loginParams))
-    //     .withMask(stackedWidget)
-    //     .onSuccess([this](const HttpResponse &response) {
-    //         qDebug() << response.code << response.data << response.message;
-    //         if (response.code != 200) {
-    //             BubbleTip::showTip(this, response.message, BubbleTip::Top, 3000);
-    //             return;
-    //         }
-    //         QString token;
-    //         if (response.data.isObject()) {
-    //             QJsonObject dataObj = response.data.toObject();
-    //             token = dataObj["accessToken"].toString();
-    //             AppEvent::instance()->setJwtToken(token);
-    //             authLogin();
-    //         }
-
-    //         if (!token.isEmpty()) {
-    //             qDebug() << "登录成功,获取到的令牌:" << token;
-    //             // 存储令牌
-    //         }
-    //     })
-    //     .onError(
-    //         [this](const QString &error) { BubbleTip::showTip(this, error, BubbleTip::Top, 2000); })
-    //     .exec(); // 执行请求
-
     QFuture<HttpResponse> loginApiFuture = AuthApi::loginApi(loginParams);
 
     // 使用fromQFuture将QFuture转换为QPromise
@@ -311,8 +303,9 @@ void MainWindow::authLogin()
                 // 这里可以添加后续处理逻辑
             }
             qDebug() << "当前角色:" << user.roleName;
+            qDebug() << "当前ID:" << user.id;
             AppEvent::instance()->setRoles(user.roleName);
-
+            AppEvent::instance()->setUserId(user.id);
             createMainWindow();
 
             checkRoom();
@@ -326,6 +319,8 @@ void MainWindow::authLogin()
         })
         .fail([this](const std::exception &e) {
             // 处理错误
+            AppEvent::instance()->setRoles({});
+            AppEvent::instance()->setUserId({});
             qWarning() << "登录后处理失败:" << e.what();
             BubbleTip::showTip(this,
                                QString("请求失败: %1").arg(e.what()),
@@ -339,6 +334,14 @@ void MainWindow::checkRoom()
 {
     // 创建两个异步操作的Promise
     RoomInfo roomInfo;
+    // 如果是管理也就是教师 直接过滤当前教师的选项
+    if (AppEvent::instance()->hasRole("role.admin")) {
+        roomInfo.ownerId = AppEvent::instance()->userId();
+        mainWidget->roomListWidget->hide();
+
+    } else {
+        mainWidget->roomListWidget->show();
+    }
     QFuture<HttpResponse> getRoomListFuture = getRoomListApi(roomInfo);
 
     // 使用fromQFuture将QFuture转换为QPromise
@@ -347,10 +350,6 @@ void MainWindow::checkRoom()
     // 使用QtPromise::all等待所有Promise完成
     QtPromise::all(QVector<QtPromise::QPromise<HttpResponse>>{userInfoPromise})
         .then([this](const QVector<HttpResponse> &results) {
-            // 处理用户信息
-
-            // 用户信息: 200 QJsonValue(object, QJsonObject({"id":"e52e6b47-f4d3-43a6-b481-570ffcc1c9db","role":[],"username":"admin"})) "success"
-            // 访问代码: 203 QJsonValue(null) "Error transferring http://127.0.0.1:8888/api/auth/codes - server replied: Not Found"
             const HttpResponse &getRoomList = results[0];
             qDebug() << "访问房间:" << getRoomList.data << getRoomList.rawData
                      << getRoomList.message;
@@ -371,8 +370,14 @@ void MainWindow::checkRoom()
             }
             if (RoomInfos.size() > 0) {
                 mainWidget->chatView->initWebsocket(RoomInfos[0].id.value());
+
+                if (AvRecorder *avRecorder = qobject_cast<AvRecorder *>(mainWidget->playerWidget)) {
+                    SettingsPage::Param param;
+                    param.liveUrl = "rtmp://192.168.3.76:1935/stream/V1";
+                    param.liveName = RoomInfos[0].id.value_or("").toStdString();
+                    avRecorder->setSettings(param);
+                }
             }
-            
         })
         .fail([this](const std::exception &e) {
             // 处理错误