Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
114 auto &mediaIntegration = *QPlatformMediaIntegration::instance();
115
116 d->q_ptr = this;
117 auto maybeControl = mediaIntegration.createRecorder(this);
118 if (maybeControl) {
119 // The first format info initialization may take some time,
120 // for users it seems to be more suitable to have a delay on the object construction
121 // rather than on QMediaRecorder::record
122 mediaIntegration.formatInfo();
123
124 d->control = maybeControl.value();
125 } else {
126 d->initErrorMessage = maybeControl.error();
127 qWarning() << "Failed to initialize QMediaRecorder" << maybeControl.error();
128 }
129}
130
136{
137 if (d_ptr->captureSession)
138 d_ptr->captureSession->setRecorder(nullptr);
139 delete d_ptr->control;
140 delete d_ptr;
141}
142
150
154void QMediaRecorder::setCaptureSession(QMediaCaptureSession *session)
155{
156 Q_D(QMediaRecorder);
157 d->captureSession = session;
158}
205{
206 return d_func()->control && d_func()->captureSession;
207}
208
210{
211 return d_func()->control ? d_func()->control->outputLocation() : QUrl();
212}
213
215{
216 Q_D(QMediaRecorder);
217 if (!d->control) {
219 return;
220 }
221 d->control->setOutputLocation(location);
222 d->control->clearActualLocation();
223 if (!location.isEmpty() && !d->control->isLocationWritable(location))
224 emit errorOccurred(QMediaRecorder::LocationNotWritable, tr("Output location not writable"));
225}
226
240{
241 Q_D(QMediaRecorder);
242 d->control->setOutputDevice(device);
243}
244
251{
252 Q_D(const QMediaRecorder);
253 return d->control->outputDevice();
254}
255
257{
258 Q_D(const QMediaRecorder);
259 return d->control ? d->control->actualLocation() : QUrl();
260}
261
269{
270 return d_func()->control ? QMediaRecorder::RecorderState(d_func()->control->state()) : StoppedState;
271}
272
282{
283 Q_D(const QMediaRecorder);
284
285 return d->control ? d->control->error() : QMediaRecorder::ResourceError;
286}
302{
303 Q_D(const QMediaRecorder);
304
305 return d->control ? d->control->errorString() : d->initErrorMessage;
306}
320{
321 return d_func()->control ? d_func()->control->duration() : 0;
322}
363{
364 Q_D(QMediaRecorder);
365
366 if (!d->control || !d->captureSession)
367 return;
368
369 if (d->control->state() == QMediaRecorder::PausedState) {
370 d->control->resume();
371 } else {
372 auto oldMediaFormat = d->encoderSettings.mediaFormat();
373
374 auto platformSession = d->captureSession->platformSession();
375 const bool hasVideo = platformSession && !platformSession->activeVideoSources().empty();
376
377 d->encoderSettings.resolveFormat(hasVideo ? QMediaFormat::RequiresVideo : QMediaFormat::NoFlags);
378 d->control->clearActualLocation();
379 d->control->clearError();
380
381 auto settings = d->encoderSettings;
382 d->control->record(d->encoderSettings);
383
384 if (settings != d->encoderSettings)
386
387 if (oldMediaFormat != d->encoderSettings.mediaFormat())
389 }
390}
410{
411 Q_D(QMediaRecorder);
412 if (d->control && d->captureSession)
413 d->control->pause();
414}
430{
431 Q_D(QMediaRecorder);
432 if (d->control && d->captureSession)
433 d->control->stop();
434}
549{
550 Q_D(const QMediaRecorder);
551
552 return d->control ? d->control->metaData() : QMediaMetaData{};
553}
554
562{
563 Q_D(QMediaRecorder);
564
565 if (d->control && d->captureSession)
566 d->control->setMetaData(metaData);
567}
568
573{
574 auto data = this->metaData();
575 // merge data
576 for (const auto &k : metaData.keys())
577 data.insert(k, metaData.value(k));
579}
601{
602 Q_D(const QMediaRecorder);
603 return d->captureSession;
604}
654{
655 Q_D(const QMediaRecorder);
656 return d->encoderSettings.mediaFormat();
657}
658
660{
661 Q_D(QMediaRecorder);
662 if (d->encoderSettings.mediaFormat() == format)
663 return;
664 d->encoderSettings.setMediaFormat(format);
666}
667
682{
683 Q_D(const QMediaRecorder);
684 return d->encoderSettings.encodingMode();
685}
686
702{
703 Q_D(QMediaRecorder);
704 if (d->encoderSettings.encodingMode() == mode)
705 return;
706 d->encoderSettings.setEncodingMode(mode);
708}
709
716{
717 Q_D(const QMediaRecorder);
718 return d->encoderSettings.quality();
719}
720
727{
728 Q_D(QMediaRecorder);
729 if (d->encoderSettings.quality() == quality)
730 return;
731 d->encoderSettings.setQuality(quality);
733}
734
749{
750 Q_D(const QMediaRecorder);
751 return d->encoderSettings.videoResolution();
752}
753
766{
767 Q_D(QMediaRecorder);
768 if (d->encoderSettings.videoResolution() == size)
769 return;
770 d->encoderSettings.setVideoResolution(size);
772}
773
794{
795 Q_D(const QMediaRecorder);
796 return d->encoderSettings.videoFrameRate();
797}
798
811{
812 Q_D(QMediaRecorder);
813 if (d->encoderSettings.videoFrameRate() == frameRate)
814 return;
815 d->encoderSettings.setVideoFrameRate(frameRate);
817}
818
829{
830 Q_D(const QMediaRecorder);
831 return d->encoderSettings.videoBitRate();
832}
833
843{
844 Q_D(QMediaRecorder);
845 if (d->encoderSettings.videoBitRate() == bitRate)
846 return;
847 d->encoderSettings.setVideoBitRate(bitRate);
849}
850
861{
862 Q_D(const QMediaRecorder);
863 return d->encoderSettings.audioBitRate();
864}
865
875{
876 Q_D(QMediaRecorder);
877 if (d->encoderSettings.audioBitRate() == bitRate)
878 return;
879 d->encoderSettings.setAudioBitRate(bitRate);
881}
882
893{
894 Q_D(const QMediaRecorder);
895 return d->encoderSettings.audioChannelCount();
896}
897
910{
911 Q_D(QMediaRecorder);
912 if (d->encoderSettings.audioChannelCount() == channels)
913 return;
914 d->encoderSettings.setAudioChannelCount(channels);
916}
917
928{
929 Q_D(const QMediaRecorder);
930 return d->encoderSettings.audioSampleRate();
931}
944{
945 Q_D(QMediaRecorder);
946 if (d->encoderSettings.audioSampleRate() == sampleRate)
947 return;
948 d->encoderSettings.setAudioSampleRate(sampleRate);
950}
951
953
954#include "moc_qmediarecorder.cpp"
IOBluetoothDevice * device
\inmodule QtCore \reentrant
Definition qiodevice.h:34
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.
QIODevice * outputDevice() const
Returns the output IO device for media content.
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
Returns true if media recorder service ready to use.
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.
void setOutputDevice(QIODevice *device)
Set the output IO device for media content.
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:103
static QPlatformMediaIntegration * instance()
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qurl.h:94
Combined button and popup list for selecting options.
#define qWarning
Definition qlogging.h:166
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:60
double qreal
Definition qtypes.h:187
QSettings settings("MySoft", "Star Runner")
[0]