$ dpkg -l cheese | grep cheese ii cheese 2.22.3-3 A tool to take pictures and videos from your $ cat /etc/debian_version 5.0.3 $ |
$ ls -F 1.0/ cheese.ui main.c Makefile $ make gcc `pkg-config --cflags --libs gtk+-2.0 gstreamer-0.10 gstreamer-interfaces-0.10 gdk-x11-2.0 xxf86vm` main.c $ ls 1.0 Makefile a.out cheese.ui main.c $ ./a.out |
$ cat Makefile all: gcc `pkg-config --cflags --libs gtk+-2.0 gstreamer-0.10 gstreamer-interfaces-0.10 gdk-x11-2.0 xxf86vm` main.c clean: rm -f *~ a.out $ cat cheese.ui <?xml version="1.0"?> <interface> <object class="GtkWindow" id="cheese_window"> <property name="visible">True</property> <property name="default_width">640</property> <property name="default_height">480</property> <child> <object class="GtkVBox" id="video_vbox"> <property name="visible">True</property> <property name="spacing">6</property> <child> <object class="GtkDrawingArea" id="video_screen"> <property name="visible">True</property> <property name="width_request">320</property> <property name="height_request">240</property> </object> </child> </object> </child> </object> </interface> $ cat main.c #include <gtk/gtk.h> #include <gst/gst.h> #include <gst/interfaces/xoverlay.h> #include <gdk/gdkx.h> #include <X11/Xlib.h> #include <X11/extensions/xf86vmode.h> GtkWidget *cheese_window,*video_screen; GstElement *pipeline,*video_display_bin,*webcam_source_bin; GstElement *video_source; XF86VidModeGamma normal_gamma; static gboolean cheese_webcam_create_video_display_bin() { GError *err=NULL; gboolean ok; GstElement *video_display_queue,*video_scale,*video_sink; char *webcam_input; video_display_bin=gst_bin_new("video_display_bin"); webcam_input="v4l2src name=video_source device=/dev/video0 ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! identity"; webcam_source_bin=gst_parse_bin_from_description(webcam_input,TRUE,&err); if(webcam_source_bin==NULL){ g_error("webcam_source_bin init error"); } video_source=gst_bin_get_by_name(GST_BIN(webcam_source_bin),"video_source"); video_display_queue=gst_element_factory_make("queue","video_display_queue"); video_scale=gst_element_factory_make("videoscale","video_scale"); g_object_set(video_scale,"method",1,NULL); video_sink=gst_element_factory_make("gconfvideosink","video_sink"); gst_bin_add_many(GST_BIN(video_display_bin),webcam_source_bin,video_display_queue,video_scale,video_sink,NULL); ok=gst_element_link_many(webcam_source_bin,video_display_queue,video_scale,video_sink,NULL); if(!ok){ g_error("unable to create video display bin"); } return TRUE; } static void cheese_webcam_set_x_overlay() { GstXOverlay *overlay=GST_X_OVERLAY(gst_bin_get_by_interface(GST_BIN(pipeline),GST_TYPE_X_OVERLAY)); gst_x_overlay_set_xwindow_id(overlay,GDK_WINDOW_XWINDOW(video_screen->window)); } static void window_close(GtkWidget *widget,gpointer data) { gst_element_set_state(pipeline,GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline)); gtk_main_quit(); } int main(int argc,char *argv[]) { GtkBuilder *builder; GError *error; g_thread_init(NULL); gdk_threads_init(); gtk_init(&argc,&argv); gst_init(&argc,&argv); builder=gtk_builder_new(); gtk_builder_add_from_file(builder,"cheese.ui",&error); cheese_window=GTK_WIDGET(gtk_builder_get_object(builder,"cheese_window")); video_screen=GTK_WIDGET(gtk_builder_get_object(builder,"video_screen")); g_object_unref(G_OBJECT(builder)); g_signal_connect(cheese_window,"destroy",G_CALLBACK(window_close),NULL); pipeline=gst_pipeline_new("pipeline"); cheese_webcam_create_video_display_bin(); gst_bin_add_many(GST_BIN(pipeline),video_display_bin,NULL); gdk_threads_enter(); XF86VidModeGetGamma(GDK_DISPLAY(),0,&normal_gamma); gdk_threads_leave(); gst_element_set_state(pipeline,GST_STATE_PLAYING); cheese_webcam_set_x_overlay(); gtk_widget_show_all(cheese_window); gdk_threads_enter(); gtk_main(); gdk_threads_leave(); return 0; } $ |
c gnu
[火星人 ] The Bare Minimum Code-最小化程序代碼已經有598次圍觀