2 import gst, gtk, gobject
8 class mediaplayer(object):
9 PLAY_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)
10 PAUSE_IMAGE = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)
13 self.playbin = gst.element_factory_make('playbin2')
15 self.bus = self.playbin.get_bus()
16 self.bus.add_signal_watch()
17 self.bus.connect("message::eos", self.on_finish)
19 self.spinner.set_range(0, 100)
20 self.spinner.set_increments(1, 10)
21 self.spinner.connect('value-changed', self.on_spinner_change)
23 self.seeker.set_range(0, 100)
24 self.seeker.set_increments(1, 10)
25 self.seeker.connect('change-value', self.on_seeker_change)
26 self.seeker.connect('button-press-event', self.on_button_press)
27 self.seeker.connect('button-release-event', self.on_button_release)
29 self.play_button = gtk.Button()
30 self.play_button.set_image(self.PLAY_IMAGE)
31 self.play_button.connect('clicked', self.on_play_clicked)
32 self.bbox.pack_start(self.play_button, False)
34 self.begin_button = gtk.Button()
35 self.begin_button.set_image(self.PLAY_IMAGE)
36 self.begin_button.connect('clicked', self.on_begin_clicked)
37 self.bbox.pack_start(self.begin_button, False)
39 self.end_button = gtk.Button()
40 self.end_button.set_image(self.PLAY_IMAGE)
41 self.end_button.connect('clicked', self.on_end_clicked)
42 self.bbox.pack_start(self.end_button, False)
46 self.is_loaded = False
47 self.is_playing = False
48 self.known_range = False
51 self.playbin.set_property('uri', uri)
52 self.playbin.set_state(gst.STATE_PLAYING)
53 self.label.label = 'f';
54 gobject.timeout_add(500, self.update_slider)
55 self.is_playing = True
57 self.known_range = False
58 self.label.set_text(uri)
60 def on_finish(self, bus, message):
61 self.playbin.set_state(gst.STATE_PAUSED);
62 self.spinner.set_value(0);
63 self.seeker.set_value(0);
65 def on_video_realized(self, sender):
66 self.sink.set_xwindow_id(self.drawingarea.window.xid)
68 def update_slider(self):
69 if not self.is_playing:
73 if not self.known_range:
74 duration_nanosecs, format = self.playbin.query_duration(gst.FORMAT_TIME)
75 if duration_nanosecs > 0:
76 duration_secs = float(duration_nanosecs) / gst.SECOND
78 self.seeker.set_range(0, duration_secs)
79 self.spinner.set_range(0, duration_secs)
80 self.known_range = True
81 print "Duration: %f" % (duration_secs)
83 nanosecs, format = self.playbin.query_position(gst.FORMAT_TIME)
85 # block seek handler so we don't seek when we set_value()
86 self.seeker.handler_block_by_func(self.on_seeker_change)
87 self.spinner.handler_block_by_func(self.on_spinner_change)
89 value = float(nanosecs) / gst.SECOND;
91 #print "Trigger: %f" % (value)
93 self.seeker.set_value(value)
94 self.spinner.set_text("%f" %(value))
96 self.seeker.handler_unblock_by_func(self.on_seeker_change)
97 self.spinner.handler_unblock_by_func(self.on_spinner_change)
99 except gst.QueryError:
100 # pipeline must not be ready and does not know position
103 return True # continue calling every 30 milliseconds
106 def on_seeker_change(self, element, a, b):
107 seek_time_secs = element.get_value()
108 self.mseek(seek_time_secs)
110 def on_spinner_change(self, element):
111 seek_time_secs = float(element.get_value())
112 self.mseek(seek_time_secs)
115 self.playbin.set_state(gst.STATE_PLAYING)
118 self.playbin.set_state(gst.STATE_PAUSED)
120 def mseek(self, seek_time_secs):
121 print 'seek: %f' % (seek_time_secs)
122 self.playbin.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT, seek_time_secs * gst.SECOND)
124 def on_button_press(self, element, a):
128 def on_button_release(self, element, a):
132 def on_play_clicked(self, element):
135 self.play_button.set_image(self.PLAY_IMAGE)
136 self.is_playing = False;
139 self.play_button.set_image(self.PAUSE_IMAGE)
140 self.is_playing = True;
142 def on_begin_clicked(self, element):
144 def on_end_clicked(self, element):