2 import gst, gtk, gobject
8 class mediaplayer(object):
10 self.playbin = gst.element_factory_make('playbin2')
12 self.bus = self.playbin.get_bus()
13 self.bus.add_signal_watch()
14 self.bus.connect("message::eos", self.on_finish)
16 self.spinner.set_range(0, 100)
17 self.spinner.set_increments(1, 10)
18 self.spinner.connect('change-value', self.on_seeker_change)
20 self.seeker.set_range(0, 100)
21 self.seeker.set_increments(1, 10)
22 self.seeker.connect('change-value', self.on_seeker_change)
23 self.seeker.connect('button-press-event', self.on_button_press)
24 self.seeker.connect('button-release-event', self.on_button_release)
26 self.is_playing = False
27 self.known_range = False
30 self.playbin.set_property('uri', uri)
31 self.playbin.set_state(gst.STATE_PLAYING)
32 self.label.label = 'f';
33 gobject.timeout_add(100, self.update_slider)
34 self.is_playing = True
35 self.known_range = False
37 def on_finish(self, bus, message):
38 self.playbin.set_state(gst.STATE_PAUSED);
39 self.spinner.set_value(0);
40 self.seeker.set_value(0);
42 def on_video_realized(self, sender):
43 self.sink.set_xwindow_id(self.drawingarea.window.xid)
45 def update_slider(self):
46 if not self.is_playing:
47 return False # cancel timeout
50 if not self.known_range:
51 duration_nanosecs, format = self.playbin.query_duration(gst.FORMAT_TIME)
52 if duration_nanosecs > 0:
53 duration_secs = float(duration_nanosecs) / gst.SECOND
55 self.seeker.set_range(0, duration_secs)
56 self.spinner.set_range(0, duration_secs)
57 self.known_range = True
58 print "Duration: %f" % (duration_secs)
60 nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
62 # block seek handler so we don't seek when we set_value()
63 self.seeker.handler_block_by_func(self.on_seeker_change)
64 self.spinner.handler_block_by_func(self.on_seeker_change)
66 value = float(nanosecs) / gst.SECOND;
68 #print "Trigger: %f" % (value)
70 self.seeker.set_value(value)
71 self.spinner.set_text("%f" %(value))
73 self.seeker.handler_unblock_by_func(self.on_seeker_change)
74 self.spinner.handler_unblock_by_func(self.on_seeker_change)
76 except gst.QueryError:
77 # pipeline must not be ready and does not know position
80 return True # continue calling every 30 milliseconds
83 def on_seeker_change(self, element, a, b):
84 print 'on_seeker_change'
85 seek_time_secs = element.get_value()
86 self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND)
88 def on_button_press(self, element, a):
89 self.playbin.set_state(gst.STATE_PAUSED);
91 def on_button_release(self, element, a):
92 self.playbin.set_state(gst.STATE_PLAYING)