小编lyn*_*nix的帖子

C,GTK:以<60 fps显示RGB图像流

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

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

我已经完成了所有硬件工作,现在有了一个回调函数,可以通过摄像头捕获的每个新图像调用它.

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

这是我已经尝试过的:

  • 使用gdk_draw_rgb_image()一个GTK绘图区:基本工作,但呈现缓慢,在绘制过程重叠和前几帧后的应用程序崩溃,甚至在1分fps的捕获率.

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

  • 使用开罗(cairo_set_source_surface(),然后cairo_paint()):看起来相当快,但图像看起来条纹,不知道图像格式是否兼容.

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

提前感谢任何建议!

c gtk rgb stream

6
推荐指数
1
解决办法
1713
查看次数

C:char大于一个字节?

我正在char从这样的微控制器设备中读取类型的缓冲区:

char data_buffer[DATA_LEN];
FILE *aq_dev = fopen(argv[1], "r");

fread(data_buffer, 1, DATA_LEN, aq_dev);

fclose(aq_dev);
Run Code Online (Sandbox Code Playgroud)

在这个缓冲区blob中有无符号的16位整数,每个整数分布在缓冲区中的两个条目上.例如,有

data_buffer[10] = 0x07
data_buffer[11] = 0xc3
Run Code Online (Sandbox Code Playgroud)

我想读出0x07c3它等于1987年.尽管事实上我原本以为我可以用uint16_t指针访问缓冲区并直接读取值,但我必须做一些奇怪的bitmasking:

int value = (buffer[10] << 8) + buffer[11];
Run Code Online (Sandbox Code Playgroud)

给出一个超过35000 的错误值,而看似无用的bitmasking就像

int value = ((buffer[10] & 0xff) << 8) + (buffer[11] & 0xff);
Run Code Online (Sandbox Code Playgroud)

返回正确的值.

一个数组的条目如何char大于一个字节? 根据我的limits.h(Linux,x86_64),有#define CHAR_BIT 8.

有人可以告诉我我的代码有什么问题吗?提前致谢!

c char

3
推荐指数
1
解决办法
1490
查看次数

标签 统计

c ×2

char ×1

gtk ×1

rgb ×1

stream ×1