【问题标题】:Efficiently read the average color of the screen content rendered by XBMC高效读取 XBMC 渲染的屏幕内容的平均颜色
【发布时间】:2012-11-26 17:37:51
【问题描述】:

我想在运行 XBMC 以更改电视环境光的颜色时获取屏幕内容的平均颜色。 XBMC 运行在带有 OpenGL ES 2.0 硬件 (Raspberry Pi) 的小型 HTPC 上,该硬件运行 Debian 派生的发行版。我想我必须从 XBMC 使用 OpenGL 绘制的屏幕 帧缓冲区 中读取。 (至少,我认为并希望 XBMC 使用 OpenGL 渲染所有内容。)

是否可以读取代表整个屏幕输出的 OpenGL 帧缓冲区?我需要什么才能访问它?我是否还需要一个自己的渲染上下文来访问屏幕的帧缓冲区? (我自己不会在屏幕上渲染任何东西,我只想阅读)。

高效计算平均颜色是下一个任务。我正在考虑每行/列每 8 或 16 个像素读取一次(就足够了,我们谈论的是 1080p 高清电影),然后计算 CPU 上的平均值。欢迎任何关于更好解决方案的想法。

【问题讨论】:

  • 帧缓冲区,而不是屏幕缓冲区,因为你问过。两者都是正确的。
  • @Linuxios 谢谢。我想过说“帧缓冲区”,但是,读者可能会认为我想读回我之前渲染过的东西。这不是这里的情况。我只是强调它是整个屏幕。
  • 我们谈论的是由内核和显卡驱动程序内部保存的帧缓冲区,它通常在 X11 的控制下,它为窗口管理器管理较小的帧缓冲区和应用程序。
  • 您是否考虑过使用 libavfilter 代替? (xbmc 在后台使用 ffmpeg 进行解码 - 在这种情况下 libva 加速)
  • 嗨@leemes,你有没有机会解决这个问题?我自己也遇到了同样的挑战,目前正在研究从 OpenGl 捕获屏幕内容的方法。有一些工具,比如 glc 和 SimpleScreenRecorder 可以实现我们所追求的功能,但我还没有尝试过。

标签: linux opengl-es framebuffer screen-capture


【解决方案1】:

你应该看看the source code of Boblight

扩展 Boblight 似乎是一个可行的替代方案(如果它不支持您已经需要的东西!)。

如果没有,请查看src/clients/ 文件夹。 boblight-getpixel.c(适用于 MS Windows)和 boblight-X11.c 是“像素抓取器”;完全按照您的需要执行的独立程序,然后将抓取的颜色传达给 boblight 服务器。

boblight-X11.c 中,您有使用XShmGetImage 或更慢的XGetImage 使用X11/extensions/XShm.h 读取屏幕部分的示例,该代码的一部分执行以下操作:

[...]

if(!XShmGetImage(dpy, root_win, xim, 0, 0, AllPlanes))
{
   sleep(1);
   pthread_mutex_unlock(&grabmutex);
   return;
}

XSync(dpy, True);

for (x = 0; x < width; x += xadd)
{
    for (y = 0; y < height; y += yadd)
    {
       pixel = XGetPixel(xim, x, y);
       RGB[0] = (pixel >> 16) & 0xff;
       RGB[1] = (pixel >>  8) & 0xff;
       RGB[2] = (pixel >>  0) & 0xff;

       /*add it to the RGB array*/
       boblight_add_pixel (&config, RGB, x, y);
   }
}

[...]

【讨论】:

  • 谢谢!很有意思。的确,也许我可以只使用这个程序,主要是不变的,给我的灯上色!我想知道这种方法是否有效,因为我使用的是低端硬件(Raspberry Pi)。我想我只需要试试这个。再次感谢这个指针,我在 google 上找不到(可能我太专注于 OpenGL)
  • 虽然 XMBC 的 UI 使用 OpenGL,但我认为它在视频输出方面有很多不同的选择。不要忘记在您认为合适的时候接受答案;)
  • 链接老化得不好。
  • @Albin 谢谢,已解决。但是等到 Wayland 变得无处不在......这一切都没有任何意义;-)
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多