6#include <mediacapture/qwindowsmediadevicereader_p.h>
8#include <QtMultimedia/qaudioinput.h>
9#include <QtMultimedia/qaudiooutput.h>
10#include <QtMultimedia/qvideosink.h>
11#include <QtMultimedia/private/qplatformvideosink_p.h>
12#include <QtMultimedia/private/qwindowsmultimediautils_p.h>
13#include <QtCore/qdebug.h>
22 m_mediaDeviceReader =
new QWindowsMediaDeviceReader(
this);
23 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::streamingStarted,
24 this, &QWindowsMediaDeviceSession::handleStreamingStarted);
25 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::streamingStopped,
26 this, &QWindowsMediaDeviceSession::handleStreamingStopped);
27 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::streamingError,
28 this, &QWindowsMediaDeviceSession::handleStreamingError);
29 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::videoFrameChanged,
30 this, &QWindowsMediaDeviceSession::handleVideoFrameChanged);
31 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::recordingStarted,
32 this, &QWindowsMediaDeviceSession::recordingStarted);
33 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::recordingStopped,
34 this, &QWindowsMediaDeviceSession::recordingStopped);
35 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::recordingError,
36 this, &QWindowsMediaDeviceSession::recordingError);
37 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::durationChanged,
38 this, &QWindowsMediaDeviceSession::durationChanged);
41QWindowsMediaDeviceSession::~QWindowsMediaDeviceSession()
43 delete m_mediaDeviceReader;
58 if ((active && (m_active || m_activating)) || (!active && !m_active && !m_activating))
62 auto camId = QString::fromUtf8(m_activeCameraDevice.id());
63 auto micId = m_audioInput ? QString::fromUtf8(m_audioInput->device().id()) : QString();
64 if (!camId.isEmpty() || !micId.isEmpty()) {
65 if (m_mediaDeviceReader->activate(camId, m_cameraFormat, micId)) {
68 emit streamingError(MF_E_NOT_AVAILABLE);
71 qWarning() << Q_FUNC_INFO <<
"Camera ID and Microphone ID both undefined.";
77 emit activeChanged(m_active);
78 emit readyForCaptureChanged(m_active);
84 if (m_active || m_activating) {
94 m_activeCameraDevice = camera;
100 return m_activeCameraDevice;
105 m_cameraFormat = cameraFormat;
117 m_activating =
false;
118 emit activeChanged(m_active);
119 emit readyForCaptureChanged(m_active);
126 emit activeChanged(m_active);
127 emit readyForCaptureChanged(m_active);
133 m_surface->platformVideoSink()->setVideoFrame(QVideoFrame());
134 emit streamingError(errorCode);
140 m_surface->platformVideoSink()->setVideoFrame(frame);
141 emit videoFrameChanged(frame);
151 m_mediaDeviceReader->setInputVolume(volume);
166 m_mediaDeviceReader->setOutputVolume(volume);
171 if (m_active || m_activating)
172 m_mediaDeviceReader->setAudioOutput(QString::fromUtf8(m_audioOutput->device().id()));
177 if (m_audioInput == input)
180 m_audioInput->disconnect(
this);
181 m_audioInput = input;
187 connect(m_audioInput, &QAudioInput::mutedChanged,
this, &QWindowsMediaDeviceSession::setAudioInputMuted);
194 if (m_audioOutput == output)
197 m_audioOutput->disconnect(
this);
198 m_audioOutput = output;
199 if (!m_audioOutput) {
200 m_mediaDeviceReader->setAudioOutput({});
204 m_mediaDeviceReader->setAudioOutput(QString::fromUtf8(m_audioOutput->device().id()));
213 std::optional<GUID> container = audioOnly
214 ? QWMF::containerForAudioFileFormat(settings.mediaFormat().fileFormat())
215 : QWMF::containerForVideoFileFormat(settings.mediaFormat().fileFormat());
217 return QMediaRecorder::FormatError;
219 GUID videoFormat = QWMF::videoFormatForCodec(settings.videoCodec());
220 GUID audioFormat = QWMF::audioFormatForCodec(settings.audioCodec());
222 QSize res = settings.videoResolution();
223 UINT32 width, height;
224 if (res.width() > 0 && res.height() > 0) {
225 width = UINT32(res.width());
226 height = UINT32(res.height());
228 width = m_mediaDeviceReader->frameWidth();
229 height = m_mediaDeviceReader->frameHeight();
230 settings.setVideoResolution(QSize(
int(width),
int(height)));
233 qreal frameRate = settings.videoFrameRate();
234 if (frameRate <= 0) {
235 frameRate = m_mediaDeviceReader->frameRate();
236 settings.setVideoFrameRate(frameRate);
239 auto quality = settings.quality();
241 UINT32 videoBitRate = 0;
242 if (settings.videoBitRate() > 0) {
243 videoBitRate = UINT32(settings.videoBitRate());
245 videoBitRate = estimateVideoBitRate(videoFormat, width, height, frameRate, quality);
246 settings.setVideoBitRate(
int(videoBitRate));
249 UINT32 audioBitRate = 0;
250 if (settings.audioBitRate() > 0) {
251 audioBitRate = UINT32(settings.audioBitRate());
253 audioBitRate = estimateAudioBitRate(audioFormat, quality);
254 settings.setAudioBitRate(
int(audioBitRate));
257 return m_mediaDeviceReader->startRecording(fileName, *container, audioOnly ? GUID_NULL : videoFormat,
258 videoBitRate, width, height, frameRate,
259 audioFormat, audioBitRate);
279 qreal frameRate, QMediaRecorder::Quality quality)
281 Q_UNUSED(videoFormat);
285 case QMediaRecorder::Quality::VeryLowQuality:
288 case QMediaRecorder::Quality::LowQuality:
291 case QMediaRecorder::Quality::NormalQuality:
294 case QMediaRecorder::Quality::HighQuality:
297 case QMediaRecorder::Quality::VeryHighQuality:
306 quint32 pixelsPerSec = quint32(qMax(width, 320u) * qMax(height, 240u) * qMax(frameRate, 6.0));
307 return pixelsPerSec * bitsPerPixel;
312 if (audioFormat == MFAudioFormat_AAC) {
315 case QMediaRecorder::Quality::VeryLowQuality:
317 case QMediaRecorder::Quality::LowQuality:
319 case QMediaRecorder::Quality::NormalQuality:
321 case QMediaRecorder::Quality::HighQuality:
323 case QMediaRecorder::Quality::VeryHighQuality:
328 }
else if (audioFormat == MFAudioFormat_MP3) {
332 case QMediaRecorder::Quality::VeryLowQuality:
334 case QMediaRecorder::Quality::LowQuality:
336 case QMediaRecorder::Quality::NormalQuality:
338 case QMediaRecorder::Quality::HighQuality:
340 case QMediaRecorder::Quality::VeryHighQuality:
345 }
else if (audioFormat == MFAudioFormat_WMAudioV8) {
348 case QMediaRecorder::Quality::VeryLowQuality:
350 case QMediaRecorder::Quality::LowQuality:
352 case QMediaRecorder::Quality::NormalQuality:
354 case QMediaRecorder::Quality::HighQuality:
356 case QMediaRecorder::Quality::VeryHighQuality:
361 }
else if (audioFormat == MFAudioFormat_WMAudioV9) {
364 case QMediaRecorder::Quality::VeryLowQuality:
366 case QMediaRecorder::Quality::LowQuality:
368 case QMediaRecorder::Quality::NormalQuality:
370 case QMediaRecorder::Quality::HighQuality:
372 case QMediaRecorder::Quality::VeryHighQuality:
383#include "moc_qwindowsmediadevicesession_p.cpp"
Combined button and popup list for selecting options.