想让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:
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;
}
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一遍不是很好,的确是这样,可以再改进。这里纯粹是演示一下。