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 | 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 中生成的媒体进行编码和录制:
- 音频。使用QAudioInput 或QAudioBufferInput 。
- 视频。使用QCamera 、QScreenCapture 、QWindowCapture 或QVideoFrameInput 。
要录制媒体,请将生成器连接到相应的媒体捕获会话。
视频编码和录制的性能受硬件、操作系统、安装的图形驱动程序和输入视频格式的限制。如果QCamera
、QScreenCapture
或QWindowCapture
生成视频帧的速度快于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::ConstantQualityEncoding | 0 | 编码将以恒定质量为目标,根据需要调整比特率。 |
QMediaRecorder::ConstantBitRateEncoding | 1 | 编码将使用恒定比特率,并根据需要调整质量。 |
QMediaRecorder::AverageBitRateEncoding | 2 | 编码将尽量保持平均比特率设置,但也会根据需要使用或多或少的比特率。 |
QMediaRecorder::TwoPassEncoding | 3 | 首先对媒体进行处理以确定其特征,然后进行第二次处理,将更多比特分配到需要的区域。 |
enum QMediaRecorder::Error
常数 | 值 | 说明 |
---|---|---|
QMediaRecorder::NoError | 0 | 无错误。 |
QMediaRecorder::ResourceError | 1 | 设备未就绪或不可用。 |
QMediaRecorder::FormatError | 2 | 不支持当前格式。 |
QMediaRecorder::OutOfSpaceError | 3 | 设备上没有剩余空间。 |
QMediaRecorder::LocationNotWritable | 4 | 输出位置不可写。 |
enum QMediaRecorder::Quality
枚举质量编码级别。
常数 | 值 |
---|---|
QMediaRecorder::VeryLowQuality | 0 |
QMediaRecorder::LowQuality | 1 |
QMediaRecorder::NormalQuality | 2 |
QMediaRecorder::HighQuality | 3 |
QMediaRecorder::VeryHighQuality | 4 |
enum QMediaRecorder::RecorderState
常数 | 值 | 说明 |
---|---|---|
QMediaRecorder::StoppedState | 0 | 记录盒未激活。 |
QMediaRecorder::RecordingState | 1 | 要求记录。 |
QMediaRecorder::PausedState | 2 | 记录仪暂停。 |
属性文档
[read-only]
actualLocation : const QUrl
此属性保存最后一个媒体内容的实际位置。
当分配了新的outputLocation 或非空的outputDevice 时,实际位置将被重置。当调用record() 且outputDevice
为null
或不可写时,记录盒会根据以下规则生成实际位置。
- 如果
outputLocation
为空、目录或无扩展名的文件,记录盒会根据所选媒体格式和系统 MIME 类型生成适当的扩展名。 - 如果
outputLocation
是一个目录,记录器会在其中生成一个新的文件名。 - 如果
outputLocation
为空,录音机会在系统特定的音频或视频目录中生成一个新文件名。 - 记录器在发出
recorderStateChanged(RecordingState)
之前会生成实际位置。
访问功能:
QUrl | actualLocation() const |
通知信号:
void | actualLocationChanged(const QUrl &location) |
autoStop : bool
该属性控制当所有媒体输入报告流结束或已停用时,媒体记录器是否自动停止。
流结束时会发送一个空媒体帧,可以通过QVideoFrameInput 或QAudioBufferInput 明确发送。
视频输入,特别是QCamera 、QScreenCapture 和QWindowCapture ,可通过函数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::audioCodec 或QMediaFormat::fileFormat 属性被设置为未指定,则始终会发生这种情况。如果视频源(QCamera 、QScreenCapture 或QVideoFrameInput )连接到QMediaCaptureSession ,还必须指定QMediaFormat::videoCodec 。如果媒体后端不支持所选文件格式或编解码器,QMediaFormat::audioCodec 和QMediaFormat::videoCodec 属性值也可能发生变化。
如果请求的是视频格式,但QMediaCaptureSession 没有连接视频源,则QMediaFormat::fileFormat 属性值也可能变为仅audio
格式。例如,如果QMediaFormat::fileFormat 设置为QMediaFormat::MPEG4 ,则可能会更改为QMediaFormat::Mpeg4Audio 。
应用程序可通过调用QMediaFormat::isSupported() 函数来确定mediaFormat
是否会在录制开始前更改。在没有任何视频输入的情况下进行录制时,如果以下条件为真,record() 将不会更改为QMediaFormat :
- QMediaFormat::fileFormat 已指定
- QMediaFormat::audioCodec 已指定
- QMediaFormat::videoCodec 未指定
- QMediaFormat::isSupported() 返回
true
使用视频输入录制时,如果以下条件为真,mediaFormat
将不会更改:
- QMediaFormat::fileFormat 已指定
- QMediaFormat::audioCodec 已指定
- QMediaFormat::videoCodec 已指定
- QMediaFormat::isSupported() 返回
true
注意: 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) |
通知信号
void | metaDataChanged() |
outputLocation : QUrl
该属性用于保存媒体内容的目标位置。
设置位置可能会失败,例如当服务只支持本地文件系统位置,但传递的是网络 URL 时。如果操作失败,就会发出errorOccurred() 信号。
如果已为刻录机分配了可写outputDevice ,输出位置将被忽略。这种行为将来可能会改变,因此我们建议只设置一个输出,即outputLocation
或outputDevice
。
输出位置可以是空、目录或文件。指向目录或文件的路径可以是相对路径,也可以是绝对路径。record() 方法会根据指定的输出位置和系统特定设置生成实际位置。详情请参阅actualLocation 属性说明。
访问功能:
QUrl | outputLocation() const |
void | setOutputLocation(const QUrl &location) |
另请参阅 actualLocation 和outputDevice()。
quality : Quality
返回记录质量。
访问功能:
QMediaRecorder::Quality | quality() const |
void | setQuality(QMediaRecorder::Quality quality) |
提示信号:
void | qualityChanged() |
[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 必须在录制开始前以WriteOnly 或ReadWrite 模式打开。
媒体记录器不拥有指定device 的所有权。如果已开始录制,则必须保持设备存活并打开,直到发出信号recorderStateChanged(StoppedState)
。
除非指定的device 是null
,否则该方法会立即重置actualLocation 。
如果为记录器分配了可写输出设备,则outputLocation 将被忽略,记录开始时也不会生成actualLocation 。这种行为将来可能会改变,因此我们建议只设置一个输出,即outputLocation
或outputDevice
。
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)
设置编码视频分辨率的width 和height 。
这是一个重载函数。
注: 属性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.