GStreamer如何让videosink在指定的窗口进行图像绘制?

想让xvimagesink/ximagesink这样的element在我们指定的窗口中绘制video?简单的很: 

1. new一个GtkDrawingArea 
2. connect它的expose-event signal,e.g: 

// Drawing on our drawing area 
g_signal_connect(G_OBJECT(area), "expose-event", G_CALLBACK(expose_cb), NULL); 

3. 书写callback函数expose_cb,e.g: 
/* Callback to be called when the drawing area is exposed */
static gboolean expose_cb(GtkWidget * widget, GdkEventExpose * event, gpointer data)
{
    
// `play->videosink'就是video sink element
    gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(play->videosink),
                         GDK_WINDOW_XWINDOW(widget
->window));
    
return FALSE;
}

这样就OK了。expose-event是drawingarea每次重绘的时候会发出的signal,应该说每次重绘都去set一遍不是很好,的确是这样,可以再改进。这里纯粹是演示一下。 

原文地址:https://www.cnblogs.com/super119/p/1924444.html