rendered paste bodyimport gobjectgobject.threads_init ()import gstimport sysclass Loop (object): def __init__ (self): self.loop = gobject.MainLoop () self.pipeline = gst.Pipeline () self.bus = self.pipeline.get_bus () self.bus.add_signal_watch () self.bus.connect ("message::eos", self._bus_message_eos_cb) self.bus.connect ("message::error", self._bus_message_error_cb) self.bus.connect ("message::segment-done", self._bus_message_segment_done_cb) for e in ("filesrc", "decodebin", "audioconvert", "alsasink"): element = gst.element_factory_make (e) setattr (self, e, element) self.pipeline.add (element) self.filesrc.set_property ("location", sys.argv [1]) self.filesrc.link (self.decodebin) self.decodebin.connect ("new-decoded-pad", self._decodebin_new_decoded_pad_cb) self.audioconvert.link (self.alsasink) 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 _bus_message_segment_done_cb (self, bus, message): print "segment done" self.seek () def _decodebin_new_decoded_pad_cb (self, decodebin, pad, no_more): pad.link (self.audioconvert.get_pad ("sink")) def seek (self): self.pipeline.seek (1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_SEGMENT, gst.SEEK_TYPE_SET, 10 * gst.SECOND, gst.SEEK_TYPE_SET, 12 * gst.SECOND) def start (self): self.pipeline.set_state (gst.STATE_PAUSED) self.pipeline.get_state () self.seek () self.pipeline.set_state (gst.STATE_PLAYING) self.loop.run () self.pipeline.set_state (gst.STATE_NULL)if __name__ == '__main__': Loop ().start ()