import sys, os, time, thread import glib, gobject import pygst pygst.require("0.10") import gst class CLI_Main: def __init__(self): self.count=0 self.player= gst.Pipeline("player") self.filesrc = gst.element_factory_make("filesrc","filesource") self.decoder = gst.element_factory_make("decodebin2", "decoder") self.decoder.connect("new-decoded-pad",self.decoder_callback) self.jpegenc = gst.element_factory_make("jpegenc", "jpegenc") self.jpegenc.connect("frame-encoded",self.encoder_callback) self.filesink = gst.element_factory_make("filesink", "filesink") self.filesink.set_property("location","frame.jpg") self.player.add(self.filesrc, self.decoder,self.jpegenc,self.filesink) gst.element_link_many(self.filesrc, self.decoder) gst.element_link_many(self.jpegenc,self.filesink) bus = self.player.get_bus() bus.add_signal_watch() bus.connect("message", self.on_message) def on_message(self, bus, message): t = message.type print t if t == gst.MESSAGE_EOS: self.player.set_state(gst.STATE_NULL) self.playmode = False elif t == gst.MESSAGE_ERROR: self.player.set_state(gst.STATE_NULL) err, debug = message.parse_error() print "Error: %s" % err, debug self.playmode = False def start(self): for filepath in sys.argv[1:]: if os.path.isfile(filepath): print filepath self.filesrc.set_property("location",filepath) self.playmode=True self.player.set_state(gst.STATE_PLAYING) while self.playmode: time.sleep(1) time.sleep(1) loop.quit() def decoder_callback(self,decoder,pad,data): print "Callback!" name= pad.get_caps()[0].get_name() print "Got pad!: %s" % name if name.startswith("video"): jpad= self.jpegenc.get_pad("sink") pad.link(jpad) def encoder_callback(self,decoder): print "Frame encoded" name= "frame%s.jpg" % self.count #self.filesink.set_property("location",name) self.count+=1 mainclass = CLI_Main() thread.start_new_thread(mainclass.start, ()) gobject.threads_init() loop = glib.MainLoop() loop.run()