【问题标题】:How do I render "Video" in Qt / X11 on an embedded device如何在嵌入式设备上的 Qt / X11 中呈现“视频”
【发布时间】:2011-10-25 17:21:34
【问题描述】:

我目前正在尝试编写一个应用程序来显示来自专用 USB 设备的实时“视频”。 USB 设备提供约。灰度级阵列中的 320x240 视频每秒 10 帧。该应用程序是在运行 linux 和 X11 的 iMx51 (800Mhz arm) 平台上用 Qt 编写的。我的应用程序需要显示此视频,按 2 倍缩放(即 640x480)并使用尽可能少的 CPU。

目前,图像显示为一个简单的 QLabel,每次从设备传输新的视频帧时,它都会更新其像素图。当 QLabel 以 320x240 显示时,视频播放流畅,应用程序使用 20% 的 CPU。

当我们尝试将 QLabel 的大小扩展到 640x480 时,CPU 使用率会达到峰值,以 10 帧/秒的速度消耗所有可用资源。我们减少 CPU 使用率的唯一方法是丢帧。

我们尝试编写一个带有自定义绘制事件的小部件来自己绘制视频图像的内容,但无济于事,这种技术使用的 CPU 比 QLabel 略多。

我们这样做的其他产品能够将图像直接传送到原始帧缓冲区(没有 x11),尽管它们的 CPU 速度要慢得多,但它们可以毫无问题地处理此任务。似乎 X11 和 Qt 为我们增加了巨大的开销。

必须有一种正确的方式来通过 Qt 和 X11 显示不断更新的图像,这种方式不会占用大量资源。我们正在探索让 openGL ES 启动并在该单元上运行的可能性,但这暂时可能是不可能的。 Qt 框架中是否缺少某些东西可以让我完成这个相对简单的任务?

【问题讨论】:

    标签: c++ video qt4 x11 embedded-linux


    【解决方案1】:

    下载并阅读 VLC 源代码后,我决定使用 X11 的 Xvideo 扩展。 VLC 源代码包含一个使用 xcb 与 xserver 通信的 xvideo 输出“引擎”。我以此为例编写了自己的解决方案。

    在我们的平台上,xvideo 扩展的缩放和显示功能是硬件加速的。

    我打算在时间允许的情况下尽快提供教程和示例代码。

    【讨论】:

      【解决方案2】:

      您的分辨率问题是 CPU 比 GPU 慢得多,因此使用标签渲染帧确实是个坏主意。当您提高分辨率时,CPU 必须处理的数据量会成倍增加。处理视频时,您必须使用运行速度更快的 GPU。

      我建议您使用 Qt OpenGL 模块 (http://doc.qt.nokia.com/4.7/qtopengl.html) 中的 QGL 小部件。

      您可以从设备中读取帧,将它们移动到显存中,使用 GPU 来渲染它们(如果您了解/知道如何操作,也可以应用滤镜和效果),从而节省大量 CPU 时间并减少您的分辨率问题。

      【讨论】:

      • 如果飞思卡尔可以为我们提供工作的 opengl 驱动程序,这可能是我们采用的方法。我听说将纹理推送到 opengl 相当慢,但我假设它不像加载/缩放 qpixmaps 那样慢。
      • 这取决于你使用它的方式。最好的方法是使用像素缓冲区对象,这样您就不必为每个帧分配/取消分配/重新分配内存,并且数据传输更流畅。看看这个:songho.ca/opengl/gl_pbo.html
      【解决方案3】:

      不要使用 QLabel 来显示移动的内容。相反,子类 QWidget 并实现您自己的小部件。此外,您可能想尝试直接绘制(QWidget 的标志)以避免双重缓冲等。

      当然,使用 GPU 进行缩放等很好,但在我看来,您仍然需要使用 CPU 将所有数据从设备移动到 GPU。 IE。您仍然会使用相当多的循环来移动 1 和 0。

      【讨论】:

        【解决方案4】:

        “Plain”X11 由于其客户端-服务器架构,位图渲染效率非常低,您需要使用 MIT-SHM 扩展。根据 Qt 版本,它可能包括原生使用 MIT-SHM 的“光栅”图形引擎。

        另请参阅What is the fastest way to display an image in QT on X11 without OpenGL? - 最终我设法从 Qt 获得了非常不错的性能。诀窍是观察您复制位图的次数并尝试将其最小化。

        请注意,位图并不需要 OpenGL,如果您的硬件有合适的驱动程序,您可以尝试 2D 加速。您有共享内存,因此对于位图渲染,您的 GPU 与 CPU 一样快,如果您使用其他硬件进行位图渲染(本质上是内存到内存的传输),它只会为您节省一些 CPU 周期。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-09
          • 2018-06-03
          • 1970-01-01
          • 2021-10-10
          • 1970-01-01
          • 1970-01-01
          • 2013-06-25
          相关资源
          最近更新 更多