如何使用Xlib逐帧显示像素来制作视频序列?

时间:2015-07-21 08:52:09

标签: c linux graphics x11

我想使用Xlib逐帧绘制像素。

如果我的帧尺寸为1100 * 1000,我应该写这样的东西吗?

for(i=0;i<=1100;i++)
{
 for(j=0;j<=1000;j++)
  {
    XDrawPoint(arguments,i,j);
  }
}

但是,这仅适用于单帧。如何重复它以显示视频序列?

1 个答案:

答案 0 :(得分:3)

回答你的实际问题:准备下一帧,然后nanosleep(2),直到显示下一帧,然后告诉X11显示它。根据我的理解,使用VDPAU,您可以通过向服务器提供准备好的帧来获得更精确的帧定时,其时间戳显示在何时显示。然后,您不需要那么好的软实时唤醒行为来在正确的时间显示您的帧。

将每个像素单独发送到X服务器将非常慢。查看Xv(x-video),或在本地绘制整个pixmap并将其发送到服务器。或者OpenGL将是另一种用于绘制纹理并在屏幕上显示它们的API。像mpv或vlc这样的视频播放软件最近使用OpenGL进行视频输出,可以实现高质量的缩放,也可以使用复合桌面实现更好的行为。 Xv曾经是默认设置,几乎在所有Linux系统上都能很好地运行,即使是没有良好OpenGL支持的系统也是如此。 (视频播放软件不只是使用pixmaps,因为它们需要硬件支持,以便从YUV转换为RGB,并将硬件缩放到全屏)。

从长远来看,您可能最好将Qt或GTK库用于代码。如果你还不知道低级X11 API,那么学习它们主要是浪费时间,IMO。现在使用便携式窗口库编写程序是一个更好的主意,因此它们可以很好地集成到人们的桌面中,并且可以针对Linux / Mac / Windows本机图形进行编译。