我试图将 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_native
GtkDrawingArea 获取 GtkNative 并将 GdkSurface 附加到它,但这是返回 GtkWindow 的表面。
我正在寻找一种方法来让 XID 传递给gst_video_overlay_set_window_handle
能够在小部件中播放视频。
我对 Gtk 和 Gstreamer 都很陌生,因此对我的理解上的差距表示歉意。