142QMediaRecorder::QMediaRecorder(QObject *parent)
144 d_ptr(
new QMediaRecorderPrivate)
148 auto &mediaIntegration = *QPlatformMediaIntegration::instance();
151 auto maybeControl = mediaIntegration.createRecorder(
this);
156 mediaIntegration.formatInfo();
158 d->control = maybeControl.value();
160 d->initErrorMessage = maybeControl.error();
161 qWarning() <<
"Failed to initialize QMediaRecorder" << maybeControl.error();
286void QMediaRecorder::setOutputLocation(
const QUrl &location)
290 emit errorOccurred(QMediaRecorder::ResourceError, d->initErrorMessage);
293 d->control->setOutputLocation(location);
294 d->control->clearActualLocation();
295 if (!location.isEmpty() && !d->control->isLocationWritable(location))
296 emit errorOccurred(QMediaRecorder::LocationNotWritable,
297 QStringLiteral(
"Output location not writable"));
322void QMediaRecorder::setOutputDevice(QIODevice *device)
326 emit errorOccurred(QMediaRecorder::ResourceError, d->initErrorMessage);
330 d->control->setOutputDevice(device);
333 d->control->clearActualLocation();
462void QMediaRecorder::record()
466 if (!d->control || !d->captureSession)
469 if (d->control->state() == QMediaRecorder::PausedState) {
470 d->control->resume();
472 auto oldMediaFormat = d->encoderSettings.mediaFormat();
474 auto platformSession = d->captureSession->platformSession();
475 const bool hasVideo = platformSession && !platformSession->activeVideoSources().empty();
477 d->encoderSettings.resolveFormat(hasVideo ? QMediaFormat::RequiresVideo : QMediaFormat::NoFlags);
478 d->control->clearActualLocation();
479 d->control->clearError();
481 auto settings = d->encoderSettings;
482 d->control->record(d->encoderSettings);
484#if QT_DEPRECATED_SINCE(6
, 9
)
486QT_WARNING_DISABLE_DEPRECATED
487 if (settings != d->encoderSettings)
488 emit encoderSettingsChanged();
492 if (oldMediaFormat != d->encoderSettings.mediaFormat())
493 emit mediaFormatChanged();
495 if (settings.encodingMode() != d->encoderSettings.encodingMode())
496 emit encodingModeChanged();
498 if (settings.quality() != d->encoderSettings.quality())
499 emit qualityChanged();
501 if (settings.videoResolution() != d->encoderSettings.videoResolution())
502 emit videoResolutionChanged();
504 if (!QtPrivate::fuzzyCompare(settings.videoFrameRate(),
505 d->encoderSettings.videoFrameRate()))
506 emit videoFrameRateChanged();
508 if (settings.videoBitRate() != d->encoderSettings.videoBitRate())
509 emit videoBitRateChanged();
511 if (settings.audioBitRate() != d->encoderSettings.audioBitRate())
512 emit audioBitRateChanged();
514 if (settings.audioChannelCount() != d->encoderSettings.audioChannelCount())
515 emit audioChannelCountChanged();
517 if (settings.audioSampleRate() != d->encoderSettings.audioSampleRate())
518 emit audioSampleRateChanged();
944void QMediaRecorder::setQuality(Quality quality)
948 quality = std::clamp(quality, QMediaRecorder::Quality::VeryLowQuality,
949 QMediaRecorder::Quality::VeryHighQuality);
951 if (d->encoderSettings.quality() == quality)
954 d->encoderSettings.setQuality(quality);
955 emit qualityChanged();