将原始v4l2缓冲区转换为qt中的QVideoframe

问题描述 投票:1回答:1

我将使用VIDIOC_DQBUF从V4L2驱动程序中获取原始视频数据,我想使用QVideoFrame(用于构建视频帧)和QLabel / QPaint(用于渲染视频帧)在qt中渲染此帧。

QVideoFrame :: QVideoFrame(QAbstractVideoBuffer * buffer,const QSize&size,QVideoFrame :: PixelFormat format)从缓冲区构造视频帧,并具有给定的像素格式和大小(以像素为单位)。Qvideoframe from Qt

截至目前,我正在使用QImage渲染RGB24,并且QImage支持唯一的RGB格式。但是,从VIDIOC_DQBUF接收的原始视频帧具有不同的颜色格式,并且QVideoFrame支持其中的大多数。

查询:

  1. 如何为v4l2缓冲区使用QVideoFrame :: QVideoFrame(QAbstractVideoBuffer * buffer,const QSize&size,QVideoFrame :: PixelFormat格式?

  2. 我如何使用map(),bits()和mappingBytes()函数,以便可以为给定的原始视频数据构造QVideoFrame?

  3. 我如何使用QPaint / QLabel渲染QVideoFrame?

关于,Kulakrni

qt qpainter qlabel v4l2 qtmultimedia
1个回答
0
投票

让顺序颠倒。

如何使用QPaint / QLabel渲染QVideoFrame?

您不能。您需要使用QAbstractVideoSurface()派生类。在QML中,这是VideoOutput。如果只需要一张图像,则QVideoFrame不是用于QPaint / QLabel的正确类。

我如何使用map(),bits()和mappingBytes()函数,以便可以为给定的原始视频数据构造QVideoFrame?

这些功能是您与QAbstractVideoSurface的接口。这取决于您要如何存储VL4缓冲区。您要复制/翻译它还是直接将其映射?那么该API会尝试解决所有权问题。

如何为v4l2缓冲区使用QVideoFrame :: QVideoFrame(QAbstractVideoBuffer * buffer,const QSize&size,QVideoFrame :: PixelFormat格式

[您需要通过复制/翻译数据并将其保存在类中来为QAbstractVideoBuffer子类化,或者如果您使用某种零拷贝,则提供引用。

参见:Qt Video overview

© www.soinside.com 2019 - 2024. All rights reserved.