C、GTK:以 < 60 fps 的速度显示 RGB 图像流

Posted

技术标签:

【中文标题】C、GTK:以 < 60 fps 的速度显示 RGB 图像流【英文标题】:C, GTK: display stream of RGB images at < 60 fps 【发布时间】:2012-02-09 13:40:43 【问题描述】:

我正在开发一个应用程序,该应用程序应从相机设备接收图像并将它们显示在 GTK 窗口中。

相机以不同的帧速率 (1-50 fps) 提供原始 RGB 图像(每像素 3 字节,无 Alpha 通道,固定大小)。

我已经完成了所有硬件方面的工作,现在有了一个回调函数,该函数会在相机捕获的每张新图像中被调用。

在我的窗口中显示这些图像最简单但又足够快的方法是什么?

这是我已经尝试过的:

在 gtk 绘图区域上使用 gdk_draw_rgb_image():基本上可以工作,但渲染速度太慢,以至于绘图过程重叠并且应用程序在前几帧后崩溃,即使在 1 fps 捕获率。

为每个新帧分配一个 GdkPixbuf 并在 gtk 图像小部件上调用 gtk_image_set_from_pixbuf():只显示第一帧,然后我看不到任何变化窗户。可能是我的代码中的一个错误,但不知道这是否足够快。

使用Cairocairo_set_source_surface(),然后cairo_paint()):看起来很快,但是图像看起来有条纹,不知道图像格式是否兼容。

目前我正在考虑尝试像 gstreamer 之类的东西并将这些图像视为视频流,但我不确定这对于我的简单机制是否有点过头了。

提前感谢您的任何建议!

【问题讨论】:

Cairo 以 32 位字定义其 CAIRO_FORMAT_RGB24 图像表面像素,因此在小端机器的内存中,像素将为 BGR0BGR0,您可能正在使用相反的,或者没有放入0 字节,因此剥离。 @lynix 我需要编写相同的代码。您能分享如何在 cairo 获取网络摄像头供稿吗? @inckka:从那时起已经 4 年了,你的问题太笼统了,任何人都无法给你一个准确的答案。我的具体问题已经解决this way。 @lynix 你在哪里调用 img_update 函数?在 main 里面有一个暴露事件回调? 【参考方案1】:

整个 GdkRGB API 似乎已被弃用,因此这可能不是解决此问题的推荐方法。

对render a pixbuf 的调用也是如此。那里的文档指向开罗,因此解决方案似乎是继续调查为什么您的图像在开罗渲染时看起来不正确。

【讨论】:

谢谢,这解释了为什么我找不到任何关于 GdkRGB-stuff 的完整教程。我现在会选择 cairo,只是想知道它是否足够快 50 fps【参考方案2】:

放松是对的,如果您想要在 GTK2 和 GTK3 中工作的东西,那么开罗就是您的选择。由于您的样本是没有 alpha 的 RGB,因此您应该使用 CAIRO_FORMAT_RGB24 格式。确保您绘制的表面采用该格式。如果输入图像保持相同的大小,还要尝试确保您不会不断分配/销毁表面缓冲区。

【讨论】:

谢谢,我已经开始用 cairo 实现了。 由于我是 *** 的新手,我应该问一下如何解决我在 cairo 在这里或在新线程中遇到的一个问题吗? :) @lynix 如果您有新问题,请发布新问题。 Stack Overflow 基于问题,而不是“线程”。这不是一个讨论论坛。

以上是关于C、GTK:以 < 60 fps 的速度显示 RGB 图像流的主要内容,如果未能解决你的问题,请参考以下文章

144Hz和60Hz显示器差别很大吗?

60 FPS 是啥意思在 Flutter 中如何一个屏幕每秒有 60 帧

使用 Core Graphics 以 30-60 fps 手动移动/旋转物体

限制 Sprite 套件帧率

如何解决使用 iphone 4s、ipad 2 以 60fps 录制视频时出现的问题?

Android 渲染机制 —— (显示原理全过程解析)