我是 Wayland 编程的新手。目前,我想创建一个应用程序,它可以在 Wayland 客户端的表面上显示播放视频的 FPS。
首先,我使用 Gstreamer 读取 fps。我已经执行了两种获取 FPS 的方法:
[1] 使用定时器
static char prv_time_str[25] = {0,};
static volatile int fps_counter = 0;
static char str_fps[10] = "";
static time_t timer;
static char time_str[25];
static struct tm* tm_info;
static int ignored_first = 0;
static GstElement *overlay;
static GstPadProbeReturn
cb_have_data (GstPad *pad,
GstPadProbeInfo *info,
gpointer user_data)
{
time(&timer);
tm_info = localtime(&timer);
strftime(time_str, 25, "%Y:%m:%d%H:%M:%S\n", tm_info);
fps_counter++;
if (!strlen(prv_time_str))
strcpy(prv_time_str, time_str);
if (strcmp(prv_time_str, time_str)) {
if (ignored_first) {
sprintf(str_fps, "FPS: %d", fps_counter);
g_object_set (G_OBJECT (overlay), "text", str_fps, NULL);
g_print("fps: %d\n", fps_counter);
}
ignored_first = 1;
fps_counter = 0;
}
strcpy(prv_time_str, time_str);
return GST_PAD_PROBE_OK;
}
...
overlay = gst_element_factory_make ("textoverlay", "overlay");
g_object_set (G_OBJECT (overlay), "font-desc", "Sans, 72", NULL);
gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, (GstPadProbeCallback)cb_have_data, NULL, NULL);
我使用回调函数来计算 FPS 并尝试使用textoverlay元素显示在正在播放的视频上,但它失败了。
和
[2] 使用fpsdisplaysink。
fpssink = gst_element_factory_make ("fpsdisplaysink", "fpsdisplay");
...
g_object_set (G_OBJECT (fpssink), "text-overlay", TRUE, "video-sink", sink, NULL);
...
g_object_get (G_OBJECT (fpssink), "last-message", &fps_msg, NULL);
delay_show_FPS++;
if (fps_msg != NULL) {
if ((delay_show_FPS % DELAY_VALUE) == 0) {
g_print ("Frame info: %s\n", fps_msg);
delay_show_FPS = 0;
}
}
我设置了 fpsdisplaysink 的属性(“text-overlay”为 TRUE),但它仍然失败。FPS 值根本不显示。
其次,我尝试创建一个 Wayland 客户端(在 Weston 背景上运行)以在屏幕上显示 FPS(如上图 - 只是演示)。但我不知道这样做的方法。根据我在互联网上的调查,我可能会使用cairo lib 通过函数(cairo_show_text、cairo_show_glyphs)绘制文本。
任何人都可以帮助我吗?谢谢。