settings_page.cpp 5.9 KB

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