Как преобразовать ‘QVideoFrame’ с данными YUV в ‘QVideoframe’ с данными RGBA32 в Qt?

я получил 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);

2

Решение

Я нашел решение, которое встроен в Qt5, но НЕ ПОДДЕРЖИВАЕТСЯ Qt.

Вот как это сделать:

  1. Положил QT += multimedia-private в ваш файл qmake .pro
  2. Положил #include "private/qvideoframe_p.h" в ваш код, чтобы сделать функцию доступной.
  3. Теперь у вас есть доступ к функции со следующей подписью: QImage qt_imageFromVideoFrame(const QVideoFrame &frame);
  4. Используйте функцию для преобразования QVideoFrame временно QImage а затем создать выход 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.
//

Это не имеет значения в моем проекте, так как это персональный игрушечный продукт. Если это когда-нибудь станет серьезным, я просто отследю реализацию этой функции и скопирую ее в свой проект или что-то в этом роде.

3

Другие решения

Я нашел решение преобразования YUV -> RGB в связанный комментарий,

Так что реализация supportedPixelFormats функция, как в следующем примере, делает магию преобразования даже Форматы на основе YUV (в моем случае это преобразовал Format_YUV420P формат) в Format_RGB24 формат:

QList<QVideoFrame::PixelFormat>MyVideoSurface::
supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const
{
Q_UNUSED(handleType);
return QList<QVideoFrame::PixelFormat>()
<< QVideoFrame::Format_RGB24
;
}

Скажите, сработало ли это для вас.

1

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);
}
-2
По вопросам рекламы [email protected]