【发布时间】: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