import sys import gobject import pygst pygst.require('0.10') import gst import gtk import gtk.glade import buffer2png import time #Give glade file path fname = 'biooptico.glade' # create widget tree ... App = gtk.glade.XML(fname) drawingarea1 = App.get_widget('drawingarea1') drawingarea2 = App.get_widget('drawingarea2') snapshot_image = App.get_widget('image1') snapshotbutton = App.get_widget('snapshotbutton') recordbutton = App.get_widget('recordbutton') App.signal_autoconnect(locals()) class Player: def __init__(self): self.src = gst.element_factory_make('v4l2src') self.caps0 = gst.element_factory_make('capsfilter') self.csp0 = gst.element_factory_make('ffmpegcolorspace') self.csp1 = gst.element_factory_make('ffmpegcolorspace') self.deintl = gst.element_factory_make('ffdeinterlace') self.tee = gst.element_factory_make('tee') self.queue0 = gst.element_factory_make('queue') self.queue1 = gst.element_factory_make('queue') self.sink0 = gst.element_factory_make('xvimagesink') self.sink1 = gst.element_factory_make('ximagesink') self.pipeline = gst.Pipeline() self.pipeline.add(self.src,self.caps0,self.csp0,self.csp1,self.deintl,self.tee,self.queue0,self.queue1,self.sink0,self.sink1) self.caps0.set_property('caps',gst.caps_from_string('video/x-raw-yuv,width=480,height=360')) self.sink0.set_property('sync',False) self.src.link(self.caps0) #self.dec.connect('pad-added',self.__padAddedToDecodebin__) self.caps0.link(self.csp0) self.csp0.link(self.deintl) self.deintl.link(self.tee) self.tee.link(self.queue0) self.queue0.link(self.sink0) self.tee.link(self.queue1) self.queue1.link(self.csp1) self.csp1.link(self.sink1) #self.src.set_property('location','/home/frepe/src/biooptico/playground/AndersFilmer/davidsson1_trans.avi') gtk.gdk.Display.sync(drawingarea1.get_display()) self.sink0.set_xwindow_id(drawingarea1.window.xid) self.sink1.set_xwindow_id(drawingarea2.window.xid) self.grabber_queue = gst.element_factory_make('queue') self.grabber_vrate = gst.element_factory_make('videorate') self.grabber_caps0 = gst.element_factory_make('capsfilter') self.grabber_enc = gst.element_factory_make('theoraenc') self.grabber_mux = gst.element_factory_make('oggmux') self.grabber_tee = gst.element_factory_make('tee') self.grabber_fakesink = gst.element_factory_make('fakesink') self.grabber_filesink = gst.element_factory_make('filesink') self.pipeline.add(self.grabber_queue) self.pipeline.add(self.grabber_vrate) self.pipeline.add(self.grabber_caps0) self.pipeline.add(self.grabber_enc) self.pipeline.add(self.grabber_mux) self.pipeline.add(self.grabber_fakesink) self.pipeline.add(self.grabber_filesink) self.grabber_caps0.set_property('caps',gst.caps_from_string('video/x-raw-yuv,framerate=25/2')) self.grabber_enc.set_property('quality',16) self.grabber_filesink.set_property('location','myrec.ogg') self.tee.link(self.grabber_queue) self.grabber_queue.link(self.grabber_vrate) self.grabber_vrate.link(self.grabber_caps0) self.grabber_caps0.link(self.grabber_fakesink) self.grabber_enc.link(self.grabber_mux) self.grabber_mux.link(self.grabber_filesink) def __padAddedToDecodebin__(self,element,pad): pad.link(self.csp0.get_pad('sink')) def start(self): self.pipeline.set_state(gst.STATE_PLAYING) def __probeCb__(self,pad,buffer): print "__probeCb__ called" buffer2png.buffer2png(buffer,'/home/frepe/src/biooptico/proper/mysnapshot.png') pad.remove_buffer_probe(self.id) return True def on_snapshotbutton_clicked(self,button): "The snapshot button was clicked" print "on_snapshotbutton_clicked" self.id = self.sink0.get_pad('sink').add_buffer_probe(self.__probeCb__) snapshot_image.set_from_file('/home/frepe/src/biooptico/proper/mysnapshot.png') snapshot_image.show() return True def on_recordbutton_clicked(self,button): "The record button was clicked" print "on_recordbutton_clicked" if ( button.get_active()): # Start recording here self.pipeline.set_state(gst.STATE_PAUSED) self.grabber_caps0.unlink(self.grabber_fakesink) self.grabber_caps0.link(self.grabber_enc) self.pipeline.set_state(gst.STATE_PLAYING) else: # Stop recording here self.pipeline.set_state(gst.STATE_PAUSED) self.grabber_caps0.unlink(self.grabber_enc) self.grabber_caps0.link(self.grabber_fakesink) self.pipeline.set_state(gst.STATE_PLAYING) return True myPlayer = Player() myPlayer.start() recordbutton.connect('clicked',myPlayer.on_recordbutton_clicked) snapshotbutton.connect('clicked',myPlayer.on_snapshotbutton_clicked) gtk.main()