有什么方法可以显示相机流并在其上绘制一些东西(在 linux 中)?

Is there any way to show camera stream and draw something on top of it (in linux)?

我正在使用 freescale gpu sdk,用于绘图的 Open GLES API 和用于 ARM 架构的相机流的 Gstreamer API。在我的情况下,可以单独执行它们,但我想知道有什么方法可以显示相机流并在上面画一些东西吗?

提前致谢。

freescale 的一些处理器(例如 imx6)具有多个帧缓冲区覆盖(/dev/fb0、/dev/fb1、/dev/fb2、...)。 例如,您可以在 fb1 上流式传输相机内容,并在 fb0 上绘图。 知道所有这些 frambuffer 默认情况下都没有激活。

事实上,我不太了解X11 的行为。这就是为什么我建议您禁用 X11 并通过 openGL DRI(直接渲染基础设施)驱动程序和 DRM(直接渲染管理器)在两个帧缓冲区之一上使用 openGL 进行直接渲染,并在另一个 fb 上流式传输您的相机。 (可能是我错了,如果是这样,我希望其他人能纠正我)

This is a french documentation on how DRM and DRI works.

我过去已经遇到过这个问题。 我必须使用 GStreamer 传输视频并使用 pango 绘制文本。我做的第一件事是生成一个最小图像(当然启用了 GStreamer)但没有任何 X11 库。对我来说(也许你的模块不一样),GStreamer 默认使用 /dev/fb1 节点,然后我使用 /dev/fb0 进行 pango 渲染。

经过多次测试,很容易做到这一点。所以我也建议你做测试,尝试不同的东西,不同的方式,我希望它能如你所愿。

这取决于您的具体根文件系统,但如果您使用的是用飞思卡尔 Yocto 为 i.MX6 生成的文件系统,则默认配置为 /usr/share/vssconfig

在该文件中,您可以指定 gstreamer 使用的帧缓冲区。默认情况下,/dev/fb0 是背景帧缓冲区,/dev/fb1 是前景帧缓冲区。

您可以让 gstreamer 在 /dev/fb0 中绘制,而您在 /dev/fb1(mmap /dev/fb1 和 cairo_image_surface_create_for_data)上使用 cairo 进行绘制,使用 ioctls() 控制透明度级别超过 /dev/fb1.