Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qmediarecorder.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qmediarecorder_p.h"
5
6#include <private/qplatformmediarecorder_p.h>
7#include <qaudiodevice.h>
8#include <qcamera.h>
9#include <qscreencapture.h>
10#include <qwindowcapture.h>
12#include <private/qplatformcamera_p.h>
13#include <private/qplatformsurfacecapture_p.h>
14#include <private/qplatformmediaintegration_p.h>
15#include <private/qplatformmediacapture_p.h>
16
17#include <QtCore/qdebug.h>
18#include <QtCore/qurl.h>
19#include <QtCore/qstringlist.h>
20#include <QtCore/qmetaobject.h>
21#include <QtCore/qtimer.h>
22
23#include <qaudioformat.h>
24
26
92{
93 // Force an early initialization of the mime database
94 // to avoid a delay when recording for the first time.
96}
97
99{
100 return QMediaRecorder::tr("Failed to start recording");
101}
102
109 : QObject(parent),
110 d_ptr(new QMediaRecorderPrivate)
111{
112 Q_D(QMediaRecorder);
113 d->q_ptr = this;
114 auto maybeControl = QPlatformMediaIntegration::instance()->createRecorder(this);
115 if (maybeControl) {
116 d->control = maybeControl.value();
117 } else {
118 d->initErrorMessage = maybeControl.error();
119 qWarning() << "Failed to initialize QMediaRecorder" << maybeControl.error();
120 }
121}
122
128{
129 if (d_ptr->captureSession)
130 d_ptr->captureSession->setRecorder(nullptr);
131 delete d_ptr->control;
132 delete d_ptr;
133}
134
139{
140 return d_ptr->control;
141}
142
146void QMediaRecorder::setCaptureSession(QMediaCaptureSession *session)
147{
148 Q_D(QMediaRecorder);
149 d->captureSession = session;
150}
203{
204 return d_func()->control && d_func()->captureSession;
205}
206
208{
209 return d_func()->control ? d_func()->control->outputLocation() : QUrl();
210}
211
213{
214 Q_D(QMediaRecorder);
215 if (!d->control) {
217 return;
218 }
219 d->control->setOutputLocation(location);
220 d->control->clearActualLocation();
221 if (!location.isEmpty() && !d->control->isLocationWritable(location))
222 emit errorOccurred(QMediaRecorder::LocationNotWritable, tr("Output location not writable"));
223}
224
226{
227 Q_D(const QMediaRecorder);
228 return d->control ? d->control->actualLocation() : QUrl();
229}
230
238{
239 return d_func()->control ? QMediaRecorder::RecorderState(d_func()->control->state()) : StoppedState;
240}
241
251{
252 Q_D(const QMediaRecorder);
253
254 return d->control ? d->control->error() : QMediaRecorder::ResourceError;
255}
271{
272 Q_D(const QMediaRecorder);
273
274 return d->control ? d->control->errorString() : d->initErrorMessage;
275}
289{
290 return d_func()->control ? d_func()->control->duration() : 0;
291}
332{
333 Q_D(QMediaRecorder);
334
335 if (!d->control || !d->captureSession)
336 return;
337
338 if (d->control->state() == QMediaRecorder::PausedState) {
339 d->control->resume();
340 } else {
341 auto oldMediaFormat = d->encoderSettings.mediaFormat();
342
343 auto platformSession = d->captureSession->platformSession();
344 const bool hasVideo = platformSession && !platformSession->activeVideoSources().empty();
345
346 d->encoderSettings.resolveFormat(hasVideo ? QMediaFormat::RequiresVideo : QMediaFormat::NoFlags);
347 d->control->clearActualLocation();
348 d->control->clearError();
349
350 auto settings = d->encoderSettings;
351 d->control->record(d->encoderSettings);
352
353 if (settings != d->encoderSettings)
355
356 if (oldMediaFormat != d->encoderSettings.mediaFormat())
358 }
359}
379{
380 Q_D(QMediaRecorder);
381 if (d->control && d->captureSession)
382 d->control->pause();
383}
399{
400 Q_D(QMediaRecorder);
401 if (d->control && d->captureSession)
402 d->control->stop();
403}
518{
519 Q_D(const QMediaRecorder);
520
521 return d->control ? d->control->metaData() : QMediaMetaData{};
522}
523
531{
532 Q_D(QMediaRecorder);
533
534 if (d->control && d->captureSession)
535 d->control->setMetaData(metaData);
536}
537
542{
543 auto data = this->metaData();
544 // merge data
545 for (const auto &k : metaData.keys())
546 data.insert(k, metaData.value(k));
548}
570{
571 Q_D(const QMediaRecorder);
572 return d->captureSession;
573}
623{
624 Q_D(const QMediaRecorder);
625 return d->encoderSettings.mediaFormat();
626}
627
629{
630 Q_D(QMediaRecorder);
631 if (d->encoderSettings.mediaFormat() == format)
632 return;
633 d->encoderSettings.setMediaFormat(format);
635}
636
651{
652 Q_D(const QMediaRecorder);
653 return d->encoderSettings.encodingMode();
654}
655
671{
672 Q_D(QMediaRecorder);
673 if (d->encoderSettings.encodingMode() == mode)
674 return;
675 d->encoderSettings.setEncodingMode(mode);
677}
678
685{
686 Q_D(const QMediaRecorder);
687 return d->encoderSettings.quality();
688}
689
696{
697 Q_D(QMediaRecorder);
698 if (d->encoderSettings.quality() == quality)
699 return;
700 d->encoderSettings.setQuality(quality);
702}
703
718{
719 Q_D(const QMediaRecorder);
720 return d->encoderSettings.videoResolution();
721}
722
735{
736 Q_D(QMediaRecorder);
737 if (d->encoderSettings.videoResolution() == size)
738 return;
739 d->encoderSettings.setVideoResolution(size);
741}
742
763{
764 Q_D(const QMediaRecorder);
765 return d->encoderSettings.videoFrameRate();
766}
767
780{
781 Q_D(QMediaRecorder);
782 if (d->encoderSettings.videoFrameRate() == frameRate)
783 return;
784 d->encoderSettings.setVideoFrameRate(frameRate);
786}
787
798{
799 Q_D(const QMediaRecorder);
800 return d->encoderSettings.videoBitRate();
801}
802
812{
813 Q_D(QMediaRecorder);
814 if (d->encoderSettings.videoBitRate() == bitRate)
815 return;
816 d->encoderSettings.setVideoBitRate(bitRate);
818}
819
830{
831 Q_D(const QMediaRecorder);
832 return d->encoderSettings.audioBitRate();
833}
834
844{
845 Q_D(QMediaRecorder);
846 if (d->encoderSettings.audioBitRate() == bitRate)
847 return;
848 d->encoderSettings.setAudioBitRate(bitRate);
850}
851
862{
863 Q_D(const QMediaRecorder);
864 return d->encoderSettings.audioChannelCount();
865}
866
879{
880 Q_D(QMediaRecorder);
881 if (d->encoderSettings.audioChannelCount() == channels)
882 return;
883 d->encoderSettings.setAudioChannelCount(channels);
885}
886
897{
898 Q_D(const QMediaRecorder);
899 return d->encoderSettings.audioSampleRate();
900}
913{
914 Q_D(QMediaRecorder);
915 if (d->encoderSettings.audioSampleRate() == sampleRate)
916 return;
917 d->encoderSettings.setAudioSampleRate(sampleRate);
919}
920
922
923#include "moc_qmediarecorder.cpp"
The QMediaCaptureSession class allows capturing of audio and video content.
void setRecorder(QMediaRecorder *recorder)
\inmodule QtMultimedia
\inmodule QtMultimedia
Q_INVOKABLE QVariant value(Key k) const
\variable QMediaMetaData::NumMetaData
Q_INVOKABLE QList< Key > keys() const
\qmlmethod list<Key> QtMultimedia::mediaMetaData::keys() Returns a list of MediaMetaData....
QPlatformMediaRecorder * control
QMediaCaptureSession * captureSession
QMediaEncoderSettings encoderSettings
static QString msgFailedStartRecording()
\inmodule QtMultimedia
void pause()
\qmlmethod QtMultimedia::MediaRecorder::pause()
void stop()
\qmlmethod QtMultimedia::MediaRecorder::stop()
~QMediaRecorder()
Destroys a media recorder object.
EncodingMode
Enumerates encoding modes.
void setMediaFormat(const QMediaFormat &format)
void setAudioChannelCount(int channels)
Sets the number of audio channels.
void setAudioBitRate(int bitRate)
Sets the audio bitRate in bits per second.
void setAudioSampleRate(int sampleRate)
Sets the audio sampleRate in Hz.
Quality quality
Returns the recording quality.
qint64 duration
\qmlproperty qint64 QtMultimedia::MediaRecorder::duration
void setVideoBitRate(int bitRate)
Sets the video bitRate in bits per second.
QMediaCaptureSession * captureSession() const
Returns the media capture session.
QMediaRecorder::RecorderState recorderState
The current state of the media recorder.
void mediaFormatChanged()
void encodingModeChanged()
Signals when the encoding mode changes.
QUrl outputLocation
\qmlproperty QUrl QtMultimedia::MediaRecorder::outputLocation
void setOutputLocation(const QUrl &location)
void setVideoFrameRate(qreal frameRate)
Sets the video frameRate.
void videoBitRateChanged()
Signals when the recording video bit rate changes.
QPlatformMediaRecorder * platformRecoder() const
void videoFrameRateChanged()
Signals when the recording video frame rate changes.
void setMetaData(const QMediaMetaData &metaData)
Sets the meta data to metaData.
void encoderSettingsChanged()
Signals when the encoder settings change.
void setVideoResolution(const QSize &)
Sets the resolution of the encoded video to {size}.
void record()
\qmlmethod QtMultimedia::MediaRecorder::record()
QMediaMetaData metaData
\qmlproperty mediaMetaData QtMultimedia::MediaRecorder::metaData
QMediaRecorder::Error error
Returns the current error state.
RecorderState
\qmlproperty enumeration QtMultimedia::MediaRecorder::recorderState
void audioBitRateChanged()
Signals when the recording audio bit rate changes.
QMediaFormat mediaFormat
\qmlproperty MediaFormat QtMultimedia::MediaRecorder::mediaFormat
Quality
\qmlproperty enumeration QtMultimedia::MediaRecorder::quality
void errorOccurred(Error error, const QString &errorString)
\qmlsignal QtMultimedia::MediaRecorder::errorOccurred(Error error, const QString &errorString)
QString errorString
\qmlproperty string QtMultimedia::MediaRecorder::errorString
void setQuality(Quality quality)
QUrl actualLocation
\qmlproperty QUrl QtMultimedia::MediaRecorder::actualLocation
void qualityChanged()
Signals when the recording quality changes.
void audioChannelCountChanged()
Signals when the recording audio channel count changes.
bool isAvailable() const
\qmlproperty bool QtMultimedia::MediaRecorder::isAvailable
void audioSampleRateChanged()
Signals when the recording audio sample rate changes.
void setEncodingMode(EncodingMode)
Sets the encoding mode setting.
void addMetaData(const QMediaMetaData &metaData)
Adds metaData to the recorded media.
Error
\qmlproperty enumeration QtMultimedia::MediaRecorder::error
QMediaRecorder::EncodingMode encodingMode
QMediaRecorder(QObject *parent=nullptr)
Constructs a media recorder which records the media produced by a microphone and camera.
void videoResolutionChanged()
Signals when the video recording resolution changes.
\inmodule QtCore
Definition qobject.h:90
static QPlatformMediaIntegration * instance()
virtual QMaybe< QPlatformMediaRecorder * > createRecorder(QMediaRecorder *)
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
\inmodule QtCore
Definition qurl.h:94
Combined button and popup list for selecting options.
#define qWarning
Definition qlogging.h:162
GLint location
GLenum mode
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLsizei GLsizei GLenum format
#define tr(X)
#define emit
long long qint64
Definition qtypes.h:55
double qreal
Definition qtypes.h:92
QSettings settings("MySoft", "Star Runner")
[0]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent