Конвертировать необработанный буфер v4l2 в QVideoframe в qt
Я получу необработанные видеоданные из драйвера V4L2 с помощью VIDIOC_DQBUF, я хотел визуализировать этот кадр в qt, используя QVideoFrame(который создает видеокадр) и QLabel/QPaint(для рендеринга видеокадра).
QVideoFrame::QVideoFrame(QAbstractVideoBuffer * buffer, const QSize &size, формат QVideoFrame::PixelFormat) Создает видеокадр из буфера с заданным форматом пикселя и размером в пикселях. Qvideoframe от Qt
На данный момент я использую QImage для рендеринга RGB24, а QImage поддерживает единственный формат RGB. Однако необработанный видеокадр, полученный от VIDIOC_DQBUF, имеет разные цветовые форматы, и QVideoFrame поддерживает большинство из них.
Запросы:
Как использовать QVideoFrame::QVideoFrame(буфер QAbstractVideoBuffer *, const QSize &size, формат QVideoFrame::PixelFormat) для буфера v4l2?
Как я могу использовать функцию map(), bits() и mappedBytes(), чтобы я мог создать QVideoFrame для заданных необработанных видеоданных?
Как я могу использовать QPaint/QLabel для рендеринга QVideoFrame?
С уважением, Кулакрни
0 ответов
Давайте обратим порядок.
Как я могу использовать QPaint/QLabel для рендеринга QVideoFrame?
Вы не можете. Вам нужно использоватьQAbstractVideoSurface()
производный класс. В QML этоVideoOutput
. Если вам нужно одно изображение, тогдаQVideoFrame
не подходит для использования в QPaint/QLabel.
Как я могу использовать функции map(), bits() и mappedBytes(), чтобы получить QVideoFrame, созданный для заданных необработанных видеоданных?
Эти функции являются вашим интерфейсом к QAbstractVideoSurface
. Это зависит от того, как вы хотите хранить буфер VL4. Вы его копируете / переводите или напрямую сопоставляете; то есть проблемы владения, которые пытается решить этот API.
Как использовать QVideoFrame::QVideoFrame(QAbstractVideoBuffer *buffer, const QSize &size, QVideoFrame::PixelFormat format) для буфера v4l2
Вам нужно подкласса QAbstractVideoBuffer
копируя / переводя данные и сохраняя их вместе с классом, или предоставляя ссылку, если вы используете какую-либо нулевую копию.
По умолчанию QML Camera
а также QCamera
найдет и использует /dev/videoX
который является устройством v4l, через GStreamer. Этот класс уже должен делать правильные вещи, предоставляяVideoOutput
виджет.
См.: Обзор Qt Video