141QMediaRecorder::QMediaRecorder(QObject *parent)
143 d_ptr(
new QMediaRecorderPrivate)
147 auto &mediaIntegration = *QPlatformMediaIntegration::instance();
150 auto maybeControl = mediaIntegration.createRecorder(
this);
155 mediaIntegration.formatInfo();
157 d->control = maybeControl.value();
159 d->initErrorMessage = maybeControl.error();
160 qWarning() <<
"Failed to initialize QMediaRecorder" << maybeControl.error();
285void QMediaRecorder::setOutputLocation(
const QUrl &location)
289 emit errorOccurred(QMediaRecorder::ResourceError, d->initErrorMessage);
292 d->control->setOutputLocation(location);
293 d->control->clearActualLocation();
294 if (!location.isEmpty() && !d->control->isLocationWritable(location))
295 emit errorOccurred(QMediaRecorder::LocationNotWritable,
296 QStringLiteral(
"Output location not writable"));
321void QMediaRecorder::setOutputDevice(QIODevice *device)
325 emit errorOccurred(QMediaRecorder::ResourceError, d->initErrorMessage);
329 d->control->setOutputDevice(device);
332 d->control->clearActualLocation();
461void QMediaRecorder::record()
465 if (!d->control || !d->captureSession)
468 if (d->control->state() == QMediaRecorder::PausedState) {
469 d->control->resume();
471 auto oldMediaFormat = d->encoderSettings.mediaFormat();
473 auto platformSession = d->captureSession->platformSession();
474 const bool hasVideo = platformSession && !platformSession->activeVideoSources().empty();
476 d->encoderSettings.resolveFormat(hasVideo ? QMediaFormat::RequiresVideo : QMediaFormat::NoFlags);
477 d->control->clearActualLocation();
478 d->control->clearError();
480 auto settings = d->encoderSettings;
481 d->control->record(d->encoderSettings);
483#if QT_DEPRECATED_SINCE(6
, 9
)
485QT_WARNING_DISABLE_DEPRECATED
486 if (settings != d->encoderSettings)
487 emit encoderSettingsChanged();
491 if (oldMediaFormat != d->encoderSettings.mediaFormat())
492 emit mediaFormatChanged();
494 if (settings.encodingMode() != d->encoderSettings.encodingMode())
495 emit encodingModeChanged();
497 if (settings.quality() != d->encoderSettings.quality())
498 emit qualityChanged();
500 if (settings.videoResolution() != d->encoderSettings.videoResolution())
501 emit videoResolutionChanged();
503 if (!qFuzzyCompare(settings.videoFrameRate(), d->encoderSettings.videoFrameRate()))
504 emit videoFrameRateChanged();
506 if (settings.videoBitRate() != d->encoderSettings.videoBitRate())
507 emit videoBitRateChanged();
509 if (settings.audioBitRate() != d->encoderSettings.audioBitRate())
510 emit audioBitRateChanged();
512 if (settings.audioChannelCount() != d->encoderSettings.audioChannelCount())
513 emit audioChannelCountChanged();
515 if (settings.audioSampleRate() != d->encoderSettings.audioSampleRate())
516 emit audioSampleRateChanged();
942void QMediaRecorder::setQuality(Quality quality)
946 quality = std::clamp(quality, QMediaRecorder::Quality::VeryLowQuality,
947 QMediaRecorder::Quality::VeryHighQuality);
949 if (d->encoderSettings.quality() == quality)
952 d->encoderSettings.setQuality(quality);
953 emit qualityChanged();