settings_page.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "settings_page.h"
  2. #include <QFileDialog>
  3. #include "encoder/video_encoder.h"
  4. SettingsPage::SettingsPage(Param* param, QWidget* parent)
  5. : QDialog(parent)
  6. , _param(param)
  7. {
  8. setFont(QFont("Microsoft Yahei"));
  9. _InitUi();
  10. _InitConnect();
  11. }
  12. void SettingsPage::_InitConnect()
  13. {
  14. connect(_applyBtn, &QPushButton::released, [this] { _WriteSettings(); });
  15. connect(_cancelBtn, &QPushButton::released, [this] { this->close(); });
  16. connect(_yesBtn, &QPushButton::released, [this] {
  17. _WriteSettings();
  18. this->close();
  19. });
  20. connect(_selDirBtn, &QPushButton::released, [this] {
  21. QString selectedDir = QFileDialog::getExistingDirectory(this,
  22. "选择输出目录",
  23. "./",
  24. QFileDialog::ShowDirsOnly);
  25. // 若目录路径不为空
  26. if (!selectedDir.isEmpty()) {
  27. // 显示选择的目录路径
  28. _fileDirEdit->setText(selectedDir);
  29. }
  30. });
  31. }
  32. void SettingsPage::_WriteSettings()
  33. {
  34. _param->videoParam.bitRate = _videoBitRateBox->value() * 1000;
  35. _param->videoParam.fps = _videoFpsBox->value();
  36. _param->videoParam.name = _videoEncoderBox->currentText().toStdString();
  37. _param->audioParam.bitRate = _audioBitRateBox->value() * 1000;
  38. _param->outputDir = _fileDirEdit->text().toStdString();
  39. // _param->liveUrl = _liveUrlEdit->text().toStdString();
  40. // _param->liveName = _liveNameEdit->text().toStdString();
  41. }
  42. void SettingsPage::_InitUi()
  43. {
  44. setWindowTitle("Settings");
  45. auto layout = new QVBoxLayout;
  46. layout->addWidget(_InitVideoUi());
  47. layout->addWidget(_InitAudioUi());
  48. layout->addWidget(_InitOutputUi());
  49. auto hLayout = new QHBoxLayout;
  50. _applyBtn = new QPushButton("应用");
  51. _cancelBtn = new QPushButton("取消");
  52. _yesBtn = new QPushButton("确定");
  53. hLayout->setAlignment(Qt::AlignRight);
  54. hLayout->addWidget(_applyBtn);
  55. hLayout->addWidget(_cancelBtn);
  56. hLayout->addWidget(_yesBtn);
  57. layout->addLayout(hLayout);
  58. setLayout(layout);
  59. }
  60. QGroupBox* SettingsPage::_InitVideoUi()
  61. {
  62. auto groupBox = new QGroupBox("视频");
  63. auto layout = new QVBoxLayout;
  64. _videoBitRateBox = new QSpinBox;
  65. _videoBitRateBox->setMinimum(0);
  66. _videoBitRateBox->setMaximum(INT_MAX);
  67. _videoBitRateBox->setValue(_param->videoParam.bitRate / 1000);
  68. _videoFpsBox = new QSpinBox;
  69. _videoFpsBox->setMinimum(0);
  70. _videoFpsBox->setMaximum(60);
  71. _videoFpsBox->setValue(_param->videoParam.fps);
  72. _videoEncoderBox = new QComboBox;
  73. auto&& encoders = Encoder<MediaType::VIDEO>::GetUsableEncoders();
  74. for (auto&& encoder : encoders) {
  75. _videoEncoderBox->addItem(encoder.c_str());
  76. }
  77. _videoEncoderBox->setCurrentText(_param->videoParam.name.c_str());
  78. layout->addLayout(
  79. _CreateDescription("比特率(kB):", "越高的比特率越清晰, 但越占用硬件资源", _videoBitRateBox));
  80. layout->addLayout(
  81. _CreateDescription("帧率:", "越高的帧率越流畅, 但越占用硬件资源", _videoFpsBox));
  82. layout->addLayout(_CreateDescription(
  83. "编码器:",
  84. "libx264 为软件编码, CPU占用高但兼容性强, 其他为硬件编码, 效果与软件编码相反",
  85. _videoEncoderBox));
  86. groupBox->setLayout(layout);
  87. return groupBox;
  88. }
  89. QGroupBox* SettingsPage::_InitAudioUi()
  90. {
  91. auto groupBox = new QGroupBox("音频");
  92. auto layout = new QVBoxLayout;
  93. _audioBitRateBox = new QSpinBox;
  94. _audioBitRateBox->setMinimum(0);
  95. _audioBitRateBox->setMaximum(INT_MAX);
  96. _audioBitRateBox->setValue(_param->audioParam.bitRate / 1000);
  97. layout->addLayout(
  98. _CreateDescription("比特率(kB):", "越高的比特率越清晰, 但越占用硬件资源", _audioBitRateBox));
  99. groupBox->setLayout(layout);
  100. return groupBox;
  101. }
  102. QGroupBox* SettingsPage::_InitOutputUi()
  103. {
  104. auto groupBox = new QGroupBox("输出");
  105. auto layout = new QHBoxLayout;
  106. _fileDirEdit = new QLineEdit(_param->outputDir.c_str());
  107. _selDirBtn = new QPushButton("选择");
  108. layout->addWidget(_fileDirEdit);
  109. layout->addWidget(_selDirBtn);
  110. groupBox->setLayout(layout);
  111. return groupBox;
  112. }
  113. QHBoxLayout* SettingsPage::_CreateDescription(std::string_view text,
  114. std::string_view textEx,
  115. QWidget* widget)
  116. {
  117. auto layout = new QHBoxLayout;
  118. auto label = new QLabel(text.data());
  119. label->setToolTip(textEx.data());
  120. layout->addWidget(label);
  121. layout->addWidget(widget);
  122. return layout;
  123. }