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

时间:2018-10-05 08:05:13

标签: qt qpainter qlabel v4l2 qvideoframe

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

  

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

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

查询:

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

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

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

关于, 库拉克尼

1 个答案:

答案 0 :(得分:0)

让顺序相反。

如何使用QPaint / QLabel渲染QVideoFrame?

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

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

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

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

您需要通过复制/转换数据并将其保留在类中来对QAbstractVideoBuffer进行子类化;如果您使用某种零拷贝,则需要提供引用。


默认情况下,QML CameraQCamera将通过GStreamer查找并使用{v1l} v4l设备。此类应该已经做正确的事情以提供/dev/videoX小部件。

请参阅:Qt Video overview