3

我试图将 gstreamer 的 GUI 集成教程(https://gstreamer.freedesktop.org/documentation/tutorials/basic/toolkit-integration.html?gi-language=c)从 gtk3 移植到 gtk4。我在获取属于 GtkDrawingArea 的 X 窗口时遇到了问题。在 gtk3 中,要获取 XID 并将其传递给 GstVideoOverlay,使用以下方法:

static void realize_cb (GtkWidget *widget, CustomData *data) {
  GdkWindow *window = gtk_widget_get_window (widget);
  guintptr window_handle;

  if (!gdk_window_ensure_native (window))
    g_error ("Couldn't create native window needed for GstVideoOverlay!");

  /* Retrieve window handler from GDK */
  window_handle = GDK_WINDOW_XID (window);

  /* Pass it to playbin, which implements VideoOverlay and will forward it to the video sink */
  gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->playbin), window_handle);
}

我无法弄清楚如何在 Gtk4 中做同样的事情。由于 Gtk4 使用的是 Wayland 术语,因此 gdk 中获取 XID 的函数GDK_SURFACE_XID()将 GdkSurface* 作为参数,而 GtkWidget 中没有与 Gtk3 中类似的直接函数来获取指向 GdkSurface 的指针gtk_widget_get_window

我尝试使用gtk_widget_get_nativeGtkDrawingArea 获取 GtkNative 并将 GdkSurface 附加到它,但这是返回 GtkWindow 的表面。

我正在寻找一种方法来让 XID 传递给gst_video_overlay_set_window_handle能够在小部件中播放视频。

我对 Gtk 和 Gstreamer 都很陌生,因此对我的理解上的差距表示歉意。

4

0 回答 0