import gobject gobject.threads_init () import gst class Switch (object): def __init__ (self): self.loop = gobject.MainLoop () self.pipeline = gst.Pipeline () self.bus = self.pipeline.get_bus () self.bus.connect ("message::eos", self._bus_message_eos_cb) self.bus.connect ("message::error", self._bus_message_error_cb) self.video1 = gst.element_factory_make ("videotestsrc") self.video2 = gst.element_factory_make ("videotestsrc") self.video2.props.pattern = 4 self.csp = gst.element_factory_make ("ffmpegcolorspace") self.sink = gst.element_factory_make ("ximagesink") self.pipeline.add (self.video1, self.csp, self.sink) gst.element_link_many (self.video1, self.csp, self.sink) def _bus_message_eos_cb (self, bus, message): print "eos" self.loop.quit () def _bus_message_error_cb (self, bus, message): print "error", message self.loop.quit () def _pad_blocked_cb (self, pad, blocked): pad.unlink (pad.get_peer ()) self.pipeline.add (self.video2) self.video2.link (self.csp) self.video2.set_state (gst.STATE_PLAYING) def _timeout_cb (self): self.video1.get_pad ("src").set_blocked_async (True, self._pad_blocked_cb) def start (self): self.pipeline.set_state (gst.STATE_PLAYING) gobject.timeout_add (10000, self._timeout_cb) self.loop.run () if __name__ == '__main__': Switch ().start ()