QMediaRecorder Class

QMediaRecorder 类用于编码和记录捕获会话。更多

Header: #include <QMediaRecorder>
CMake: find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(mytarget PRIVATE Qt6::Multimedia)
qmake: QT += multimedia
在 QML 中: MediaRecorder
继承: QObject

公共类型

enum EncodingMode { ConstantQualityEncoding, ConstantBitRateEncoding, AverageBitRateEncoding, TwoPassEncoding }
enum Error { NoError, ResourceError, FormatError, OutOfSpaceError, LocationNotWritable }
enum Quality { VeryLowQuality, LowQuality, NormalQuality, HighQuality, VeryHighQuality }
enum RecorderState { StoppedState, RecordingState, PausedState }

属性

公共功能

QMediaRecorder(QObject *parent = nullptr)
virtual ~QMediaRecorder() override
QUrl actualLocation() const
void addMetaData(const QMediaMetaData &metaData)
int audioBitRate() const
int audioChannelCount() const
int audioSampleRate() const
bool autoStop() const
QMediaCaptureSession *captureSession() const
qint64 duration() const
QMediaRecorder::EncodingMode encodingMode() const
QMediaRecorder::Error error() const
QString errorString() const
bool isAvailable() const
QMediaFormat mediaFormat() const
QMediaMetaData metaData() const
QIODevice *outputDevice() const
QUrl outputLocation() const
QMediaRecorder::Quality quality() const
QMediaRecorder::RecorderState recorderState() const
void setAudioBitRate(int bitRate)
void setAudioChannelCount(int channels)
void setAudioSampleRate(int sampleRate)
void setAutoStop(bool autoStop)
void setEncodingMode(QMediaRecorder::EncodingMode mode)
void setMediaFormat(const QMediaFormat &format)
void setMetaData(const QMediaMetaData &metaData)
void setOutputDevice(QIODevice *device)
void setOutputLocation(const QUrl &location)
void setQuality(QMediaRecorder::Quality quality)
void setVideoBitRate(int bitRate)
void setVideoFrameRate(qreal frameRate)
void setVideoResolution(const QSize &size)
void setVideoResolution(int width, int height)
int videoBitRate() const
qreal videoFrameRate() const
QSize videoResolution() const

公共插槽

void pause()
void record()
void stop()

信号

void actualLocationChanged(const QUrl &location)
void audioBitRateChanged()
void audioChannelCountChanged()
void audioSampleRateChanged()
void autoStopChanged()
void durationChanged(qint64 duration)
void encodingModeChanged()
void errorChanged()
void errorOccurred(QMediaRecorder::Error error, const QString &errorString)
void mediaFormatChanged()
void metaDataChanged()
void qualityChanged()
void recorderStateChanged(QMediaRecorder::RecorderState state)
void videoBitRateChanged()
void videoFrameRateChanged()
void videoResolutionChanged()

详细说明

使用 QMediaRecorder 类可对QMediaCaptureSession 中生成的媒体进行编码和录制:

要录制媒体,请将生成器连接到相应的媒体捕获会话。

视频编码和录制的性能受硬件、操作系统、安装的图形驱动程序和输入视频格式的限制。如果QCameraQScreenCaptureQWindowCapture 生成视频帧的速度快于QMediaRecorder 的编码和录制速度,录制器可能会丢弃某些帧。如果输入帧的分辨率较高,例如 4K,且无法使用硬件加速编码,则可能出现这种情况。如果您通过QVideoFrameInput 生成输入视频,只要达到此限制且内部帧队列已满,方法QVideoFrameInput::sendVideoFrame 将什么也不做并返回false 。要想知道录像机何时准备好再次接收新帧,只能依靠信号QVideoFrameInput::readyToSendVideoFrame 。如果您无法改变视频帧的生成速度,并且不希望丢帧,考虑到硬件的内存限制,我们建议您在QVideoFrameInput 的基础上实现自己的帧队列。

QMediaCaptureSession session;
QAudioInput audioInput;
session.setAudioInput(&input);
QMediaRecorder recorder;
session.setRecorder(&recorder);
recorder.setQuality(QMediaRecorder::HighQuality);
recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3"));
recorder.record();

成员类型文档

enum QMediaRecorder::EncodingMode

枚举编码模式。

常数说明
QMediaRecorder::ConstantQualityEncoding0编码将以恒定质量为目标,根据需要调整比特率。
QMediaRecorder::ConstantBitRateEncoding1编码将使用恒定比特率,并根据需要调整质量。
QMediaRecorder::AverageBitRateEncoding2编码将尽量保持平均比特率设置,但也会根据需要使用或多或少的比特率。
QMediaRecorder::TwoPassEncoding3首先对媒体进行处理以确定其特征,然后进行第二次处理,将更多比特分配到需要的区域。

enum QMediaRecorder::Error

常数说明
QMediaRecorder::NoError0无错误。
QMediaRecorder::ResourceError1设备未就绪或不可用。
QMediaRecorder::FormatError2不支持当前格式。
QMediaRecorder::OutOfSpaceError3设备上没有剩余空间。
QMediaRecorder::LocationNotWritable4输出位置不可写。

enum QMediaRecorder::Quality

枚举质量编码级别。

常数
QMediaRecorder::VeryLowQuality0
QMediaRecorder::LowQuality1
QMediaRecorder::NormalQuality2
QMediaRecorder::HighQuality3
QMediaRecorder::VeryHighQuality4

enum QMediaRecorder::RecorderState

常数说明
QMediaRecorder::StoppedState0记录盒未激活。
QMediaRecorder::RecordingState1要求记录。
QMediaRecorder::PausedState2记录仪暂停。

属性文档

[read-only] actualLocation : const QUrl

此属性保存最后一个媒体内容的实际位置。

当分配了新的outputLocation 或非空的outputDevice 时,实际位置将被重置。当调用record() 且outputDevicenull 或不可写时,记录盒会根据以下规则生成实际位置。

  • 如果outputLocation 为空、目录或无扩展名的文件,记录盒会根据所选媒体格式和系统 MIME 类型生成适当的扩展名。
  • 如果outputLocation 是一个目录,记录器会在其中生成一个新的文件名。
  • 如果outputLocation 为空,录音机会在系统特定的音频或视频目录中生成一个新文件名。
  • 记录器在发出recorderStateChanged(RecordingState) 之前会生成实际位置。

访问功能:

QUrl actualLocation() const

通知信号:

void actualLocationChanged(const QUrl &location)

autoStop : bool

该属性控制当所有媒体输入报告流结束或已停用时,媒体记录器是否自动停止。

流结束时会发送一个空媒体帧,可以通过QVideoFrameInputQAudioBufferInput 明确发送。

视频输入,特别是QCameraQScreenCaptureQWindowCapture ,可通过函数setActive 停用。

默认为false

QMediaRecorder::autoStop 仅支持 FFmpeg 后端。

访问函数:

bool autoStop() const
void setAutoStop(bool autoStop)

Notifier 信号:

void autoStopChanged()

另请参阅 QCamera,QScreenCapture, 和QWindowCapture

[read-only] duration : const qint64

该属性保存以毫秒为单位的记录媒体持续时间。

访问功能

qint64 duration() const

通知信号:

void durationChanged(qint64 duration)

[read-only] error : const QMediaRecorder::Error

返回当前错误状态。

访问功能:

QMediaRecorder::Error error() const

Notifier 信号:

void errorChanged()

另请参见 errorString().

[read-only] errorString : const QString

返回描述当前错误状态的字符串。

访问功能:

QString errorString() const

Notifier 信号:

void errorChanged()

另请参见 error().

mediaFormat : QMediaFormat

该属性保存记录器当前的QMediaFormat

调用record() 时,该属性的值可能会发生变化。如果发生这种情况,将发出 mediaFormatChanged() 信号。如果QMediaFormat::audioCodecQMediaFormat::fileFormat 属性被设置为未指定,则始终会发生这种情况。如果视频源(QCameraQScreenCaptureQVideoFrameInput )连接到QMediaCaptureSession ,还必须指定QMediaFormat::videoCodec 。如果媒体后端不支持所选文件格式或编解码器,QMediaFormat::audioCodecQMediaFormat::videoCodec 属性值也可能发生变化。

如果请求的是视频格式,但QMediaCaptureSession 没有连接视频源,则QMediaFormat::fileFormat 属性值也可能变为仅audio 格式。例如,如果QMediaFormat::fileFormat 设置为QMediaFormat::MPEG4 ,则可能会更改为QMediaFormat::Mpeg4Audio

应用程序可通过调用QMediaFormat::isSupported() 函数来确定mediaFormat 是否会在录制开始前更改。在没有任何视频输入的情况下进行录制时,如果以下条件为真,record() 将不会更改为QMediaFormat

使用视频输入录制时,如果以下条件为真,mediaFormat 将不会更改:

注意: QMediaRecorder 在确定QMediaFormat::fileFormat 时不会考虑outputLocation 属性中的文件扩展名,如果指定了扩展名,也不会调整outputLocation QUrl 的扩展名以匹配所选文件格式。因此,应用程序应确保设置QMediaRecorder::mediaFormat::fileFormat 以匹配文件扩展名,或不指定文件扩展名。如果未指定文件扩展名,actualLocation 文件扩展名将被更新,以匹配用于记录的文件格式。

访问功能:

QMediaFormat mediaFormat() const
void setMediaFormat(const QMediaFormat &format)

通知信号:

void mediaFormatChanged()

另请参阅 QMediaFormat::isSupported() 和actualLocation

metaData : QMediaMetaData

返回与录音相关的元数据。

访问功能:

QMediaMetaData metaData() const
void setMetaData(const QMediaMetaData &metaData)

通知信号

outputLocation : QUrl

该属性用于保存媒体内容的目标位置。

设置位置可能会失败,例如当服务只支持本地文件系统位置,但传递的是网络 URL 时。如果操作失败,就会发出errorOccurred() 信号。

如果已为刻录机分配了可写outputDevice ,输出位置将被忽略。这种行为将来可能会改变,因此我们建议只设置一个输出,即outputLocationoutputDevice

输出位置可以是空、目录或文件。指向目录或文件的路径可以是相对路径,也可以是绝对路径。record() 方法会根据指定的输出位置和系统特定设置生成实际位置。详情请参阅actualLocation 属性说明。

访问功能:

QUrl outputLocation() const
void setOutputLocation(const QUrl &location)

另请参阅 actualLocationoutputDevice()。

quality : Quality

返回记录质量。

访问功能:

QMediaRecorder::Quality quality() const
void setQuality(QMediaRecorder::Quality quality)

提示信号:

[read-only] recorderState : const QMediaRecorder::RecorderState

该属性保存媒体记录器的当前状态。

状态属性代表用户请求,并在record(),pause() 或stop() 调用期间同步更改。录制失败时,录制器状态也会异步改变。

访问功能:

QMediaRecorder::RecorderState recorderState() const

Notifier 信号:

void recorderStateChanged(QMediaRecorder::RecorderState state)

成员函数 文档

QMediaRecorder::QMediaRecorder(QObject *parent = nullptr)

构造一个媒体记录器。媒体记录器是parent 的子节点。

[override virtual noexcept] QMediaRecorder::~QMediaRecorder()

销毁媒体记录器对象。

[signal] void QMediaRecorder::actualLocationChanged(const QUrl &location)

记录介质的实际location 发生变化的信号。该信号通常在开始录制时发出。

注: 属性actualLocation 的通知信号。

void QMediaRecorder::addMetaData(const QMediaMetaData &metaData)

为记录介质添加metaData

int QMediaRecorder::audioBitRate() const

返回压缩音频流的比特率(比特/秒)。

注: 属性 audioBitRate 的获取函数。

另请参阅 setAudioBitRate().

[signal] void QMediaRecorder::audioBitRateChanged()

录音音频比特率发生变化时发出的信号。

注: 物业通知信号audioBitRate

int QMediaRecorder::audioChannelCount() const

返回音频通道数。

注: 属性 audioChannelCount 的获取函数。

另请参阅 setAudioChannelCount().

[signal] void QMediaRecorder::audioChannelCountChanged()

当录音音频通道数发生变化时发出信号。

注: 物业通知信号audioChannelCount

int QMediaRecorder::audioSampleRate() const

以 Hz 为单位返回音频采样率。

注: 属性 audioSampleRate 的获取函数。

另请参阅 setAudioSampleRate().

[signal] void QMediaRecorder::audioSampleRateChanged()

录音音频采样率发生变化时发出的信号。

注: 物业通知信号audioSampleRate

QMediaCaptureSession *QMediaRecorder::captureSession() const

返回媒体捕捉会话。

[signal] void QMediaRecorder::durationChanged(qint64 duration)

记录介质duration 已更改的信号。

注: 属性duration 的通知信号。

QMediaRecorder::EncodingMode QMediaRecorder::encodingMode() const

返回编码模式。

注: 属性 encodingMode 的获取函数。

另请参阅 setEncodingMode() 和EncodingMode

[signal] void QMediaRecorder::encodingModeChanged()

编码模式改变时发出的信号。

注: 属性encodingMode 的通知信号。

[signal] void QMediaRecorder::errorOccurred(QMediaRecorder::Error error, const QString &errorString)

error 发生错误的信号,errorString 包含错误描述。

bool QMediaRecorder::isAvailable() const

如果媒体记录器服务准备就绪,则返回true

[signal] void QMediaRecorder::metaDataChanged()

媒体对象的元数据已更改的信号。

如果多个元数据元素发生变化,则会发出一次 metaDataChanged() 信号。

注: 用于属性metaData 的通知信号。

QIODevice *QMediaRecorder::outputDevice() const

返回媒体内容的输出 IO 设备。

另请参阅 setOutputDevice()。

[slot] void QMediaRecorder::pause()

暂停录音。

记录仪状态更改为QMediaRecorder::PausedState

根据平台的不同,可能不支持暂停录音。在这种情况下,记录仪状态保持不变。

[signal] void QMediaRecorder::qualityChanged()

当记录质量发生变化时发出信号。

注: 物业通知信号quality

[slot] void QMediaRecorder::record()

开始录音。

虽然记录器状态会立即变为 c{QMediaRecorder::RecordingState},但录音可能会异步开始。

如果记录失败,error() 信号会发出,记录器状态重置回QMediaRecorder::StoppedState

该方法根据其生成规则更新actualLocation

注: 在移动设备上,录制将以调用录制时的设备方向进行,并在录制期间锁定。为避免在用户界面上出现人工痕迹,我们建议在录音过程中使用QWindow 的 contentOrientation 属性将用户界面锁定为同一方向,并在录音结束后再次解锁。

QMediaRecorder::RecorderState QMediaRecorder::recorderState() const

返回当前媒体记录器状态。

注: 属性 recorderState 的获取函数。

另请参阅 QMediaRecorder::RecorderState

[signal] void QMediaRecorder::recorderStateChanged(QMediaRecorder::RecorderState state)

媒体记录器state 已更改的信号。

注: 属性recorderState 的通知信号。

void QMediaRecorder::setAudioBitRate(int bitRate)

设置音频bitRate ,单位为比特/秒。

注: 属性audioBitRate 的设置函数。

另请参阅 audioBitRate().

void QMediaRecorder::setAudioChannelCount(int channels)

设置音频channels 的数量。

值为 -1 表示录音机应根据音频源的可用性和编解码器的限制做出最佳选择。

注: 属性audioChannelCount 的设置函数。

另请参阅 audioChannelCount() 。

void QMediaRecorder::setAudioSampleRate(int sampleRate)

设置音频sampleRate ,单位为 Hz。

-1 表示录音机应根据音频源的可用性和编解码器的限制做出最佳选择。

注: 属性audioSampleRate 的设置函数。

另请参阅 audioSampleRate().

void QMediaRecorder::setEncodingMode(QMediaRecorder::EncodingMode mode)

设置编码mode

如果设置了ConstantQualityEncoding ,则使用质量编码参数,忽略比特率,否则使用比特率。

注: 属性encodingMode 的设置函数。

另请参阅 encodingMode() 和EncodingMode

void QMediaRecorder::setMetaData(const QMediaMetaData &metaData)

将元数据设置为metaData

注意: 为确保正确设置元数据,应在开始录音前进行设置。一旦开始录制,任何已设置的元数据都将附加到下一次录制中。

注: metaData 属性的设置函数。

另请参阅 metaData() 。

void QMediaRecorder::setOutputDevice(QIODevice *device)

为媒体内容设置输出 IO 设备。

device 必须在录制开始前以WriteOnlyReadWrite 模式打开。

媒体记录器不拥有指定device 的所有权。如果已开始录制,则必须保持设备存活并打开,直到发出信号recorderStateChanged(StoppedState)

除非指定的devicenull ,否则该方法会立即重置actualLocation

如果为记录器分配了可写输出设备,则outputLocation 将被忽略,记录开始时也不会生成actualLocation 。这种行为将来可能会改变,因此我们建议只设置一个输出,即outputLocationoutputDevice

QMediaRecorder::setOutputDevice 仅支持 FFmpeg 后端。

另请参阅 outputDevice() 和outputLocation

void QMediaRecorder::setVideoBitRate(int bitRate)

设置视频bitRate ,单位为比特/秒。

注: 属性videoBitRate 的设置函数。

另请参阅 videoBitRate().

void QMediaRecorder::setVideoFrameRate(qreal frameRate)

设置视频frameRate

值为 0 表示录像机应根据视频源的可用性和编解码器的限制做出最佳选择。

注: 属性videoFrameRate 的设置函数。

另请参阅 videoFrameRate() 。

void QMediaRecorder::setVideoResolution(const QSize &size)

将编码视频的分辨率设置为size

传递空QSize ,使录像机根据视频源的可用分辨率和编解码器的限制选择最佳分辨率。

注: 属性videoResolution 的设置函数。

另请参阅 videoResolution().

void QMediaRecorder::setVideoResolution(int width, int height)

设置编码视频分辨率的widthheight

这是一个重载函数。

注: 属性videoResolution 的设置函数。

[slot] void QMediaRecorder::stop()

记录盒将停止记录。不过,处理待处理的视频和音频数据可能仍需要一些时间。一旦媒体记录器的状态变为QMediaRecorder::StoppedState ,记录即告完成。

int QMediaRecorder::videoBitRate() const

返回压缩视频流的比特率(比特/秒)。

注: 属性 videoBitRate 的获取函数。

另请参阅 setVideoBitRate().

[signal] void QMediaRecorder::videoBitRateChanged()

录制视频比特率发生变化时发出的信号。

注: 物业通知信号videoBitRate

qreal QMediaRecorder::videoFrameRate() const

返回视频帧频。

注: videoFrameRate 属性的获取函数。

另请参阅 setVideoFrameRate().

[signal] void QMediaRecorder::videoFrameRateChanged()

录像帧频发生变化时发出的信号。

注: 物业通知信号videoFrameRate

QSize QMediaRecorder::videoResolution() const

返回编码视频的分辨率。

注: 属性 videoResolution 的获取函数。

另请参阅 setVideoResolution().

[signal] void QMediaRecorder::videoResolutionChanged()

视频录制分辨率发生变化时发出的信号。

注: 物业通知信号videoResolution

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.