>我从网络摄像头接收QVideoFrames
,它们包含 YUV 格式的图像数据 ( QVideoFrame::Format_YUV420P
(。如何将一个这样的帧转换为具有QVideoFrame::Format_ARGB32
或QVideoFrame::Format_RGBA32
的帧?
我可以在不低级别的情况下仅使用 Qt5 中的现有功能来做到这一点吗?
例:
QVideoFrame convertFormat(const QVideoFrame &inputframe, QVideoFrame::PixelFormat outputFormat)
{
// What comes here?
}
//Usage
QVideoFrame converted = convertFormat(mySourceFrame, QVideoFrame::Format_RGB32);
我找到了一个内置在Qt5中的解决方案,但不支持BY Qt。
以下是操作方法:
- 将
QT += multimedia-private
放入您的 qmake .pro 文件中 - 将
#include "private/qvideoframe_p.h"
放入代码中以使函数可用。 - 您现在可以访问具有以下签名的函数:
QImage qt_imageFromVideoFrame(const QVideoFrame &frame);
- 使用该函数将
QVideoFrame
转换为 temporayQImage
,然后从该图像创建输出QVideoFrame
。
这是我的示例用法:
QVideoFrame convertFormat(const QVideoFrame &inputframe, QVideoFrame::PixelFormat outputFormat)
{
inputframe->map(QAbstractVideoBuffer::ReadOnly);
QImage tempImage=qt_imageFromVideoFrame(inputframe);
inputframe->unmap();
QVideoFrame outputFrame=QVideoFrame(tempImage);
return outputFrame;
}
同样,从标头复制的警告如下所示:
// // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. //
这在我的项目中无关紧要,因为它是个人玩具产品。如果它变得严重,我会追踪该功能的实现并将其复制到我的项目中或其他东西中。
我在链接的评论中找到了一个 YUV --> RGB 转换解决方案,
因此,实现支持的PixelFormats函数(如以下示例(甚至可以将基于YUV的格式(在我的情况下,它将Format_YUV420P格式转换为Format_RGB24格式(:
QList<QVideoFrame::PixelFormat>MyVideoSurface::
supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const
{
Q_UNUSED(handleType);
return QList<QVideoFrame::PixelFormat>()
<< QVideoFrame::Format_RGB24
;
}
告诉我它是否对你有用。
https://doc.qt.io/qt-5/qvideoframe.html#map
if (inputframe.map(QAbstractVideoBuffer::ReadOnly))
{
int height = inputframe.height();
int width = inputframe.width();
uchar* bits = inputframe.bits();
// figure out the inputFormat and outputFormat, they should be QImage::Format
QImage image(bits, width, height, inputFormat);
// do your conversion
QImage outImage = image.convertToForma(outFormat); // blah convert
return QVideoFrame(outImage);
}