Rabbit Remote Control 0.1.0-alpha.2
Loading...
Searching...
No Matches
ParameterRecordUI.cpp
1// Author: Kang Lin <kl222@126.com>
2#include <QDir>
3#include <QDateTime>
4#include <QFileDialog>
5#include <QMediaRecorder>
6#include <QLoggingCategory>
7#if HAVE_QT6_MULTIMEDIA
8 #include <QMediaFormat>
9#endif
10#include "ParameterRecordUI.h"
11#include "ui_ParameterRecordUI.h"
12
13static Q_LOGGING_CATEGORY(log, "Parameter.Record.UI")
15 : CParameterUI(parent)
16 , ui(new Ui::CParameterRecordUI)
17 , m_pParameters(nullptr)
18{
19 ui->setupUi(this);
20 setWindowTitle(tr("Record"));
21 setWindowIcon(QIcon::fromTheme("media-record"));
22#if HAVE_QT6_MULTIMEDIA
23 QMediaRecorder recorder;
24 auto formats = recorder.mediaFormat().supportedFileFormats(QMediaFormat::Encode);
25 foreach(auto f, formats) {
26 qDebug(log) << "File format name:" << f;
27 ui->cmbFileFormat->addItem(QMediaFormat::fileFormatName(f), f);
28 }
29 auto video = recorder.mediaFormat().supportedVideoCodecs(QMediaFormat::Encode);
30 foreach (auto v, video) {
31 qDebug(log) << "Video codec:" << v;
32 ui->cmbVideoEncode->addItem(QMediaFormat::videoCodecName(v), (int)v);
33 }
34 ui->dsbFrameRate->setToolTip(tr("A value of 0 indicates the recorder should make an optimal choice based on what is available from the video source and the limitations of the codec.") + "\n" +
35 tr("If record remote desktop, recommended options: 24, 50, 60"));
36 auto audio = recorder.mediaFormat().supportedAudioCodecs(QMediaFormat::Encode);
37 foreach(auto a, audio) {
38 qDebug(log) << "Audio codec:" << a;
39 ui->cmbAudioEncode->addItem(QMediaFormat::audioCodecName(a), (int)a);
40 }
41 ui->sbSampleRate->setToolTip(tr("A value of -1 indicates the recorder should make an optimal choice based on what is available from the audio source, and the limitations of the codec. options: 8kHz, 11.025kHz, 22.05kHz, 16kHz, 37.8kHz, 44.1kHz, 48kHz, 96kHz, 192kHz etc"));
42
43 ui->cmbQuality->addItem("Very height", QMediaRecorder::Quality::VeryHighQuality);
44 ui->cmbQuality->addItem("Height", QMediaRecorder::Quality::HighQuality);
45 ui->cmbQuality->addItem("Normal", QMediaRecorder::Quality::NormalQuality);
46 ui->cmbQuality->addItem("Low", QMediaRecorder::Quality::LowQuality);
47 ui->cmbQuality->addItem("Very low", QMediaRecorder::Quality::VeryLowQuality);
48
49 ui->cmbEncodingMode->addItem("Constant quality", QMediaRecorder::EncodingMode::ConstantQualityEncoding);
50 ui->cmbEncodingMode->setItemData(
51 QMediaRecorder::EncodingMode::ConstantQualityEncoding,
52 tr("Encoding will aim to have a constant quality, adjusting bitrate to fit."),
53 Qt::ToolTipRole);
54 ui->cmbEncodingMode->addItem("Constant bit rate", QMediaRecorder::EncodingMode::ConstantBitRateEncoding);
55 ui->cmbEncodingMode->setItemData(
56 QMediaRecorder::EncodingMode::ConstantBitRateEncoding,
57 tr("Encoding will use a constant bit rate, adjust quality to fit."),
58 Qt::ToolTipRole);
59 ui->cmbEncodingMode->addItem("Average bit rate", QMediaRecorder::EncodingMode::AverageBitRateEncoding);
60 ui->cmbEncodingMode->setItemData(
61 QMediaRecorder::EncodingMode::AverageBitRateEncoding,
62 tr("Encoding will try to keep an average bitrate setting, but will use more or less as needed."),
63 Qt::ToolTipRole);
64 ui->cmbEncodingMode->addItem("Two pass", QMediaRecorder::EncodingMode::TwoPassEncoding);
65 ui->cmbEncodingMode->setItemData(
66 QMediaRecorder::EncodingMode::TwoPassEncoding,
67 tr("The media will first be processed to determine the characteristics, and then processed a second time allocating more bits to the areas that need it."),
68 Qt::ToolTipRole);
69 on_cmbEncodingMode_currentIndexChanged(ui->cmbEncodingMode->currentIndex());
70#endif
71}
72
73CParameterRecordUI::~CParameterRecordUI()
74{
75 delete ui;
76}
77
78int CParameterRecordUI::SetParameter(CParameter *pParameter)
79{
80 m_pParameters = qobject_cast<CParameterRecord*>(pParameter);
81 if(!m_pParameters)
82 return 1;
83 ui->gbVideo->setChecked(m_pParameters->GetEnableVideo());
84 ui->gbAudio->setChecked(m_pParameters->GetEnableAudio());
85 ui->leFolder->setText(m_pParameters->GetVideoPath());
86#if HAVE_QT6_MULTIMEDIA
87 int nIndex = -1;
88 nIndex = ui->cmbFileFormat->findData((int)m_pParameters->GetFileFormat());
89 if(-1 < nIndex)
90 ui->cmbFileFormat->setCurrentIndex(nIndex);
91
92 nIndex = ui->cmbVideoEncode->findData((int)m_pParameters->GetVideoCodec());
93 if(-1 < nIndex)
94 ui->cmbVideoEncode->setCurrentIndex(nIndex);
95
96 nIndex = ui->cmbAudioEncode->findData((int)m_pParameters->GetAudioCodec());
97 if(-1 < nIndex)
98 ui->cmbAudioEncode->setCurrentIndex(nIndex);
99
100 nIndex = ui->cmbQuality->findData((int)m_pParameters->GetQuality());
101 if(-1 < nIndex)
102 ui->cmbQuality->setCurrentIndex(nIndex);
103
104 nIndex = ui->cmbEncodingMode->findData((int)m_pParameters->GetEncodingMode());
105 if(-1 < nIndex)
106 ui->cmbEncodingMode->setCurrentIndex(nIndex);
107#endif
108 ui->dsbFrameRate->setValue(m_pParameters->GetVideoFrameRate());
109 ui->sbSampleRate->setValue(m_pParameters->GetAudioSampleRate());
110
111 switch(m_pParameters->GetEndAction()) {
112 case CParameterRecord::ENDACTION::No:
113 ui->rbNoAction->setChecked(true);
114 break;
115 case CParameterRecord::ENDACTION::OpenFile:
116 ui->rbOpenFile->setChecked(true);
117 break;
118 case CParameterRecord::ENDACTION::OpenFolder:
119 ui->rbOpenFolder->setChecked(true);
120 break;
121 }
122
123 return 0;
124}
125
126int CParameterRecordUI::Accept()
127{
128 m_pParameters->SetEnableVideo(ui->gbVideo->isChecked());
129 m_pParameters->SetEnableAudio(ui->gbAudio->isChecked());
130 m_pParameters->SetVideoPath(ui->leFolder->text());
131 QString szFile = m_pParameters->GetVideoPath()
132 + QDir::separator()
133 + QDateTime::currentDateTime().toLocalTime()
134 .toString("yyyy_MM_dd_hh_mm_ss_zzz");
135 m_pParameters->SetImageFile(szFile + ".png");
136 m_pParameters->SetVideoFile(szFile);
137#if HAVE_QT6_MULTIMEDIA
138 int nData = ui->cmbFileFormat->currentData().toInt();
139 m_pParameters->SetFileFormat((QMediaFormat::FileFormat)nData);
140
141 nData = ui->cmbVideoEncode->currentData().toInt();
142 m_pParameters->SetVideoCodec((QMediaFormat::VideoCodec)nData);
143
144 nData = ui->cmbAudioEncode->currentData().toInt();
145 m_pParameters->SetAudioCodec((QMediaFormat::AudioCodec)nData);
146
147 nData = ui->cmbQuality->currentData().toInt();
148 m_pParameters->SetQuality((QMediaRecorder::Quality)nData);
149
150 nData = ui->cmbEncodingMode->currentData().toInt();
151 m_pParameters->SetEncodingMode((QMediaRecorder::EncodingMode)nData);
152#endif
153 m_pParameters->SetVideoFrameRate(ui->dsbFrameRate->value());
154 m_pParameters->SetAudioSampleRate(ui->sbSampleRate->value());
155
156 if(ui->rbNoAction->isChecked())
157 m_pParameters->SetEndAction(CParameterRecord::ENDACTION::No);
158 else if(ui->rbOpenFile->isChecked())
159 m_pParameters->SetEndAction(CParameterRecord::ENDACTION::OpenFile);
160 else if(ui->rbOpenFolder->isChecked())
161 m_pParameters->SetEndAction(CParameterRecord::ENDACTION::OpenFolder);
162 return 0;
163}
164
165void CParameterRecordUI::on_pbFolder_clicked()
166{
167 QString szPath;
168 szPath = QFileDialog::getExistingDirectory(
169 this, tr("Open path"),
170 m_pParameters->GetVideoPath());
171 if(szPath.isEmpty())
172 return;
173 ui->leFolder->setText(szPath);
174}
175
176void CParameterRecordUI::on_cmbEncodingMode_currentIndexChanged(int index)
177{
178#if HAVE_QT6_MULTIMEDIA
179 if(ui->cmbEncodingMode->itemData(index) == QMediaRecorder::ConstantQualityEncoding) {
180 ui->cmbQuality->setEnabled(true);
181 ui->dsbFrameRate->setEnabled(false);
182 ui->dsbFrameRate->setToolTip(tr("'Encoding mode' is 'constant quality'"));
183 ui->sbSampleRate->setEnabled(false);
184 ui->sbSampleRate->setToolTip(tr("'Encoding mode' is 'constant quality'"));
185 if(ui->dsbFrameRate->value() != 0)
186 ui->dsbFrameRate->setValue(0);
187 if(ui->sbSampleRate->value() != -1)
188 ui->sbSampleRate->setValue(-1);
189 } else {
190 ui->cmbQuality->setEnabled(false);
191 ui->dsbFrameRate->setEnabled(true);
192 ui->dsbFrameRate->setToolTip(tr("A value of 0 indicates the recorder should make an optimal choice based on what is available from the video source and the limitations of the codec.") + "\n" +
193 tr("If record remote desktop, recommended options: 24, 50, 60"));
194 ui->sbSampleRate->setEnabled(true);
195 ui->sbSampleRate->setToolTip(tr("A value of -1 indicates the recorder should make an optimal choice based on what is available from the audio source, and the limitations of the codec. options: 8kHz, 11.025kHz, 22.05kHz, 16kHz, 37.8kHz, 44.1kHz, 48kHz, 96kHz, 192kHz etc"));
196 if(ui->dsbFrameRate->value() == 0)
197 ui->dsbFrameRate->setValue(24);
198 if(ui->sbSampleRate->value() == -1)
199 ui->sbSampleRate->setValue(8000);
200 }
201#endif
202}
203
The parameter UI interface.
Definition ParameterUI.h:15
Parameter interface.
Definition Parameter.h:209