class PlayerWindow(pyglet.window.Window): GUI_WIDTH = 400 GUI_HEIGHT = 40 GUI_PADDING = 4 GUI_BUTTON_HEIGHT = 16 def __init__(self, player): super().__init__(caption='Media Player', visible=False, resizable=True) self.player = player self.player.push_handlers(self) #self.player.eos_action = self.player.EOS_PAUSE self.slider = Slider(self) self.slider.x = self.GUI_PADDING self.slider.y = self.GUI_PADDING * 2 + self.GUI_BUTTON_HEIGHT self.slider.on_begin_scroll = lambda: player.pause() self.slider.on_end_scroll = lambda: player.play() self.slider.on_change = lambda value: player.seek(value) self.play_pause_button = TextButton(self) self.play_pause_button.x = self.GUI_PADDING self.play_pause_button.y = self.GUI_PADDING self.play_pause_button.height = self.GUI_BUTTON_HEIGHT self.play_pause_button.width = 45 self.play_pause_button.on_press = self.on_play_pause win = self self.window_button = TextButton(self) self.window_button.x = self.play_pause_button.x + \ self.play_pause_button.width + self.GUI_PADDING self.window_button.y = self.GUI_PADDING self.window_button.height = self.GUI_BUTTON_HEIGHT self.window_button.width = 90 self.window_button.text = 'Windowed' self.window_button.on_press = lambda: win.set_fullscreen(False) self.controls = [ self.slider, self.play_pause_button, self.window_button, ] x = self.window_button.x + self.window_button.width + self.GUI_PADDING i = 0 for screen in self.display.get_screens(): screen_button = TextButton(self) screen_button.x = x screen_button.y = self.GUI_PADDING screen_button.height = self.GUI_BUTTON_HEIGHT screen_button.width = 80 screen_button.text = 'Screen %d' % (i + 1) screen_button.on_press = \ (lambda s: lambda: win.set_fullscreen(True, screen=s))(screen) self.controls.append(screen_button) i += 1 x += screen_button.width + self.GUI_PADDING def on_eos(self): self.gui_update_state() def gui_update_source(self): if self.player.source: source = self.player.source self.slider.min = 0. self.slider.max = source.duration self.gui_update_state() def gui_update_state(self): if self.player.playing: self.play_pause_button.text = 'Pause' else: self.play_pause_button.text = 'Play' def get_video_size(self): if not self.player.source or not self.player.source.video_format: return 0, 0 video_format = self.player.source.video_format width = video_format.width height = video_format.height if video_format.sample_aspect > 1: width *= video_format.sample_aspect elif video_format.sample_aspect < 1: height /= video_format.sample_aspect return width, height def set_default_video_size(self): """Make the window size just big enough to show the current video and the GUI.""" width = self.GUI_WIDTH height = self.GUI_HEIGHT video_width, video_height = self.get_video_size() width = max(width, video_width) height += video_height self.set_size(int(width), int(height)) def on_resize(self, width, height): """Position and size video image.""" super().on_resize(width, height) self.slider.width = width - self.GUI_PADDING * 2 height -= self.GUI_HEIGHT if height <= 0: return video_width, video_height = self.get_video_size() if video_width == 0 or video_height == 0: return display_aspect = width / float(height) video_aspect = video_width / float(video_height) if video_aspect > display_aspect: self.video_width = width self.video_height = width / video_aspect else: self.video_height = height self.video_width = height * video_aspect self.video_x = (width - self.video_width) / 2 self.video_y = (height - self.video_height) / 2 + self.GUI_HEIGHT def on_mouse_press(self, x, y, button, modifiers): for control in self.controls: if control.hit_test(x, y): control.on_mouse_press(x, y, button, modifiers) def on_key_press(self, symbol, modifiers): if symbol == key.SPACE: self.on_play_pause() elif symbol == key.ESCAPE: self.dispatch_event('on_close') def on_close(self): self.player.pause() self.close() def on_play_pause(self): if self.player.playing: self.player.pause() else: if self.player.time >= self.player.source.duration: self.player.seek(0) self.player.play() self.gui_update_state() def on_draw(self): self.clear() # Video if self.player.source and self.player.source.video_format: self.player.get_texture().blit(self.video_x, self.video_y, width=self.video_width, height=self.video_height) # GUI self.slider.value = self.player.time for control in self.controls: control.draw() if len(sys.argv) < 2: print('Usage: media_player.py <filename> [<filename> ...]') sys.exit(1) for filename in sys.argv[1:]: player = mt_media.Player() window = PlayerWindow(player) source = mt_media.load(filename) player.queue(source) window.gui_update_source() window.set_default_video_size() window.set_visible(True) window.gui_update_state() player.play() pyglet.clock.schedule_interval(lambda dt: None, 0.2) pyglet.app.run()
#!/usr/bin/env python ''' ''' __docformat__ = 'restructuredtext' __version__ = '$Id: $' import setup_path import pyglet import mt_media import sys source = mt_media.load(sys.argv[1]) player = mt_media.Player() player.queue(source) player.play() player.on_eos = lambda: pyglet.app.exit() pyglet.app.run()
#!/usr/bin/env python """ """ __docformat__ = 'restructuredtext' __version__ = '$Id: $' import setup_path import pyglet import mt_media import sys source = mt_media.load(sys.argv[1]) player = mt_media.Player() player.queue(source) player.play() player.on_eos = lambda: pyglet.app.exit() pyglet.app.run()
width=self.video_width, height=self.video_height) # GUI self.slider.value = self.player.time for control in self.controls: control.draw() if __name__ == '__main__': if len(sys.argv) < 2: print 'Usage: media_player.py <filename> [<filename> ...]' sys.exit(1) for filename in sys.argv[1:]: player = mt_media.Player() window = PlayerWindow(player) source = mt_media.load(filename) player.queue(source) window.gui_update_source() window.set_default_video_size() window.set_visible(True) window.gui_update_state() player.play() pyglet.clock.schedule_interval(lambda dt: None, 0.2) pyglet.app.run()