All pastes #744655 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-10-21 18:03 UTC
rendered paste body
import gobject
gobject.threads_init ()
import gst
import sys

class 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):
        if not 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):
            print "seek failed"
            self.loop.quit ()

    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 ()