QVideoFrame 类
QVideoFrame 类表示视频数据的帧。 更多...
头文件 | #include <QVideoFrame> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Multimedia) target_link_libraries(mytarget PRIVATE Qt6::Multimedia) |
qmake | QT += multimedia |
公开类型
枚举 | HandleType { NoHandle, RhiTextureHandle } |
枚举 | MapMode { NotMapped, ReadOnly, WriteOnly, ReadWrite } |
公开函数
QVideoFrame() | |
QVideoFrame(const QVideoFrameFormat &format) | |
QVideoFrame(const QVideoFrame &other) | |
QVideoFrame(QVideoFrame &&other) | |
~QVideoFrame() | |
uchar * | bits(int plane) |
const uchar * | bits(int plane) const |
int | bytesPerLine(int plane) const |
qint64 | endTime() const |
QVideoFrame::HandleType | handleType() const |
int | height() const |
bool | isMapped() const |
bool | isReadable() const |
bool | isValid() const |
bool | isWritable() const |
bool | map(QVideoFrame::MapMode mode) |
QVideoFrame::MapMode | mapMode() const |
int | mappedBytes(int plane) const |
bool | mirrored() const |
void | paint(QPainter *painter, const QRectF &rect, const QVideoFrame::PaintOptions &options) |
QVideoFrameFormat::PixelFormat | pixelFormat() const |
int | planeCount() const |
QtVideo::Rotation | rotation() const |
void | setEndTime(qint64 time) |
void | setMirrored(bool mirrored) |
void | setRotation(QtVideo::Rotation angle) |
void | setStartTime(qint64 time) |
void | setSubtitleText(const QString &text) |
QSize | size() const |
qint64 | startTime() const |
QString | subtitleText() const |
QVideoFrameFormat | surfaceFormat() const |
void | swap(QVideoFrame &other) |
QImage | toImage() const |
void | unmap() |
int | width() const |
bool | operator!=(const QVideoFrame &other) const |
QVideoFrame & | operator=(QVideoFrame &&other) |
QVideoFrame & | operator=(const QVideoFrame &other) |
bool | operator==(const QVideoFrame &other) const |
详细说明
QVideoFrame封装了视频帧的像素数据以及帧的相关信息。
视频帧可以来自多个地方 - 解码的媒体、相机或以编程方式生成。在这些帧中描述像素的方式可以有很大的变化,并且一些像素格式在牺牲使用方便性之余提供了更大的压缩机会。
可以使用map()函数将视频帧的像素内容映射到内存中。在成功调用map()之后,可以通过各种函数访问视频数据。一些YUV像素格式在多个平面上提供数据。通过planeCount()方法将返回使用的平面数量。
在映射期间,可以通过使用bits()函数访问每个平面的视频数据,该函数返回一个指向缓冲区的指针。这个缓冲区的大小由mappedBytes()函数给出,每行的尺寸由bytesPerLine()给出。也可以使用handle()函数的返回值来使用内部缓冲区的原生API(例如,OpenGL纹理句柄)访问帧数据。
视频帧还可以关联时间戳信息。这些时间戳可以用来确定何时开始和停止显示帧。
QVideoFrame对象可能消耗大量的内存或系统资源,不应保留超过应用程序所需的时长。
注意:由于视频帧的复制可能成本很高,QVideoFrame明确实现为共享,因此对视频帧所做的任何修改也将应用到任何副本上。
成员类型文档
枚举 QVideoFrame::HandleType
标识视频缓冲区句柄的类型。
常量 | 值 | 描述 |
---|---|---|
QVideoFrame::NoHandle | 0 | 缓冲区没有句柄,其数据只能通过映射缓冲区来访问。 |
QVideoFrame::RhiTextureHandle | 1 | 缓冲区的句柄由Qt渲染硬件接口(RHI)定义。RHI是Qt内部用于3D API(如OpenGL、Vulkan、Metal和Direct 3D)的图形抽象。 |
参阅:handleType()
枚举 QVideoFrame::MapMode
枚举了视频缓冲区数据如何映射到系统内存。
常量 | 值 | 描述 |
---|---|---|
QVideoFrame::NotMapped | 0x00 | 视频缓冲区没有映射到内存。 |
QVideoFrame::ReadOnly | 0x01 | 当映射时,映射的内存将填充来自视频缓冲区的数据,但映射内存的内容在取消映射时可能会被丢弃。 |
QVideoFrame::WriteOnly | 0x02 | 当映射时,映射的内存未初始化,但可能修改的内容将在取消映射时用于填充视频缓冲区。 |
QVideoFrame::ReadWrite | ReadOnly | WriteOnly | 已映射的内存填充了视频缓冲区中的数据,当内存未被映射时,视频缓冲区将重新填充映射内存的内容。 |
成员函数文档
QVideoFrame::QVideoFrame()
构造一个空的视频帧。
QVideoFrame::QVideoFrame(const QVideoFrameFormat &format)
构建给定像素格式的视频帧。
QVideoFrame::QVideoFrame(const QVideoFrame &other)
构造其他的浅拷贝。由于QVideoFrame是显式共享的,这两个实例将反映相同的帧。
[noexcept]
QVideoFrame::QVideoFrame(QVideoFrame &&other)
通过从其他移动来构造一个QVideoFrame。
[noexcept]
QVideoFrame::~QVideoFrame()
销毁视频帧。
uchar *QVideoFrame::bits(int plane)
返回一个指向帧数据缓冲区开始的指针,对于plane。
此值仅在帧数据被映射时有效。
通过此指针对数据进行的更改(当以写入权限映射时)仅保证在调用unmap() 时和缓冲区已被映射用于写入时已持久化。
也见map、mappedBytes、bytesPerLine 和 planeCount。
const uchar *QVideoFrame::bits(int plane) const
返回一个指向帧数据缓冲区开始的指针,对于plane。
此值仅在帧数据被映射时有效。
如果没有以读取访问权限映射缓冲区,则此缓冲区的内容最初将未被初始化。
也见map、mappedBytes、bytesPerLine 和 planeCount。
int QVideoFrame::bytesPerLine(int plane) const
返回plane扫描线中的字节数。
此值仅在帧数据被映射时有效。
也见bits、map、mappedBytes 和 planeCount。
qint64 QVideoFrame::endTime() const
返回帧应停止显示时的呈现时间(微秒)。
无效的时间表示为 -1。
也见setEndTime。
QVideoFrame::HandleType QVideoFrame::handleType() const
返回视频帧句柄的类型。
句柄类型可以是 NoHandle,表示帧是内存基础的,或者 RHI 纹理。
int QVideoFrame::height() const
返回视频帧的高度。
bool QVideoFrame::isMapped() const
识别视频帧的内容是否目前映射到系统内存。
这是一个便利函数,用于检查帧的映射模式是否不等于QVideoFrame::NotMapped。
如果视频帧的内容已映射到系统内存,则返回 true,否则返回 false。
另请参阅mapMode() 和 QVideoFrame::MapMode。
bool QVideoFrame::isReadable() const
识别从映射的视频帧读取了映射的内容。
这是一个便利函数,用于检查 MapMode 是否包含 QVideoFrame::WriteOnly 标志。
如果映射内存的内容是从视频帧中读取的,则返回 true,否则返回 false。
另请参阅mapMode() 和 QVideoFrame::MapMode。
bool QVideoFrame::isValid() const
识别视频帧是否有效。
无效的帧没有与之关联的视频缓冲区。
如果帧是有效的,则返回 true,如果不是则返回 false。
bool QVideoFrame::isWritable() const
识别视频帧的映射内容是否在取消映射时保留。
这是一个便利函数,用于检查 MapMode 是否包含 QVideoFrame::WriteOnly 标志。
如果视频帧在取消映射时会更新,则返回 true,否则返回 false。
注意:以只读模式映射的帧的数据更改结果是未定义的。根据缓冲区实现的不同,更改可能会保留,或者更糟,改变共享缓冲区。
另请参阅mapMode() 和 QVideoFrame::MapMode。
bool QVideoFrame::map(QVideoFrame::MapMode mode)
将视频帧的内容映射到系统(CPU可访问)内存。
在某些情况下,视频帧数据可能存储在视频内存或其他无法访问的内存中,因此在访问像素数据之前必须映射一个帧。这可能涉及到内容复制,因此除非需要,否则请避免映射和取消映射。
映射模式 mode 指示映射内存的内容是否应该从/或写入帧。如果映射模式包括 QVideoFrame::ReadOnly
标志,则初始映射时将使用视频帧的内容填充映射内存。如果映射模式包括 QVideoFrame::WriteOnly
标志,则可能更改的映射内存的内容在取消映射时将写回帧。
在映射期间,可以通过由 bits() 函数返回的指针直接访问视频帧的内存内容。
当不再需要访问数据时,务必调用 unmap() 函数来释放映射内存并可能更新视频帧内容。
如果视频帧是以只读模式映射的,则可以多次以只读模式将其映射(并相应地取消映射)。在所有其他情况下,在第二次映射之前必须首先取消映射。
注意:向仅读模式映射的内存写入是未定义的,可能会导致共享数据的更改或崩溃。
如果帧在给定的 mode 下映射到内存,则返回 true,否则返回 false。
另请参阅 unmap(),mapMode() 和 bits()。
QVideoFrame::MapMode QVideoFrame::mapMode() const
返回视频帧映射到系统内存的模式。
另请参阅 map() 和 QVideoFrame::MapMode。
int QVideoFrame::mappedBytes(int plane) const
返回映射帧数据中平面 plane 占用的字节数。
此值仅在帧数据被映射时有效。
另请参阅 map。
bool QVideoFrame::mirrored() const
返回是否在显示之前应对帧进行镜像。
另请参阅 setMirrored。
void QVideoFrame::paint(QPainter *painter, const QRectF &rect, const QVideoFrame::PaintOptions &options)
使用 QPainter,painter,将此 QVideoFrame 渲染到 rect 中。PaintOptions options 可用于指定背景颜色以及如何填充 rect 的视频。
注意: 使用此方法渲染时通常会不使用硬件加速。
QVideoFrameFormat::PixelFormat QVideoFrame::pixelFormat() const
返回此视频帧的像素格式。
int QVideoFrame::planeCount() const
返回视频帧中平面的数量。
另请参阅 map。
QtVideo::Rotation QVideoFrame::rotation() const
返回在显示之前应将帧按顺时针方向旋转的角度。
另请参阅 setRotation。
void QVideoFrame::setEndTime(qint64 time)
设置帧应停止显示的显示时间 time(以微秒为单位)。
无效的时间表示为 -1。
另请参阅 endTime。
void QVideoFrame::setMirrored(bool mirrored)
设置帧的 mirrored 标志并将该标志设置为底层的 surfaceFormat。
另请参阅 mirrored。
void QVideoFrame::setRotation(QtVideo::Rotation angle)
设置在显示之前帧应按顺时针方向旋转的角度 angle。
另请参阅 rotation。
void QVideoFrame::setStartTime(qint64 time)
设置帧应最初显示的显示时间 time(以微秒为单位)。
无效的时间表示为 -1。
另请参阅 startTime。
void QVideoFrame::setSubtitleText(const QString &text)
将与此视频帧一起渲染的字幕文本设置为text。
另请参阅subtitleText()。
QSize QVideoFrame::size() const
返回视频帧的尺寸。
qint64 QVideoFrame::startTime() const
返回帧应显示时的呈现时间(以微秒为单位)。
无效的时间表示为 -1。
另请参阅setStartTime()。
QString QVideoFrame::subtitleText() const
返回与此视频帧一起渲染的字幕文本。
另请参阅setSubtitleText()。
QVideoFrameFormat QVideoFrame::surfaceFormat() const
返回此视频帧的表面格式。
[noexcept]
void QVideoFrame::swap(QVideoFrame &other)
交换当前视频帧与other。
QImage QVideoFrame::toImage() const
根据像素格式将当前视频帧转换为图像。
void QVideoFrame::unmap()
释放由函数
如果映射模式包含
如果失败,不要调用unmap()函数。
另请参阅 map。
int QVideoFrame::width() const
返回视频帧的宽度。
bool QVideoFrame::operator!=(const QVideoFrame &other) const
如果此QVideoFrame和other不反映相同的帧,则返回true
。
[noexcept]
QVideoFrame &QVideoFrame::operator=(QVideoFrame &&other)
将other移动到此QVideoFrame。
QVideoFrame &QVideoFrame::operator=(const QVideoFrame &other)
将other的内容分配给此视频帧。由于QVideoFrame是显式共享的,这两个实例将反映相同的帧。
bool QVideoFrame::operator==(const QVideoFrame &other) const
如果此QVideoFrame和other反映相同的帧,则返回true
。
版权所有 © 2024 The Qt Company Ltd. 本文档中的贡献内容均为各所有者的版权。提供的文档 根据 GNU 自由文档许可证版本 1.3 许可,由自由软件基金会发布。Qt 及其相关标志为芬兰及全球其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为各自所有者的财产。