class VideoPlayerApp(App): def build(self): filename = 'videoplayback.avi' self.layout = GridLayout(cols=2) self.video = VideoPlayer(source=filename, state='play') self.layout.add_widget(self.video) button1 = Button(text='Play video1', font_size=14) button1.bind(on_press=self.play_video1) button1.size_hint = (0.2, 0.1) self.layout.add_widget(button1) button2 = Button(text='pauza video1', font_size=14) button2.size_hint = (0.2, 0.1) button2.bind(on_press=self.pauza_video1) self.layout.add_widget(button2) button3 = Button(text='stop video1', font_size=14) button3.size_hint = (0.2, 0.1) button3.bind(on_press=self.stop_video1) self.layout.add_widget(button3) button4 = Button(text='la 1/3 din film', font_size=14) button4.size_hint = (0.2, 0.1) button4.bind(on_press=self.un_sfert_video1) self.layout.add_widget(button4) button5 = Button(text='la 2/3 din film', font_size=14) button5.size_hint = (0.2, 0.1) button5.bind(on_press=self.doua_sferturi_video1) self.layout.add_widget(button5) button6 = Button(text='volum : -', font_size=14) button6.size_hint = (0.2, 0.1) button6.bind(on_press=self.minus_video1) self.layout.add_widget(button6) button7 = Button(text='volum : +', font_size=14) button7.size_hint = (0.2, 0.1) button7.bind(on_press=self.plus_video1) self.layout.add_widget(button7) return self.layout def play_video1(self, buton): self.video.state = 'play' def pauza_video1(self, buton): self.video.state = 'pause' def stop_video1(self, buton): self.video.state = 'stop' def un_sfert_video1(self, buton): self.video.seek(0.33) def doua_sferturi_video1(self, buton): self.video.seek(0.66) def minus_video1(self, buton): if (self.video.volume > 0): self.video.volume -= 0.1 def plus_video1(self, buton): if (self.video.volume < 1): self.video.volume += 0.1
class VideoPlayerApp(App): def build(self): filename = 'videoplayback.avi' self.layout = GridLayout(cols=2) self.video = VideoPlayer(source=filename, state='play') self.layout.add_widget(self.video) button1 = Button(text='Play video1', font_size=14) button1.bind(on_press=self.play_video1) button1.size_hint=(0.2,0.1) self.layout.add_widget(button1) button2 = Button(text='pauza video1', font_size=14) button2.size_hint=(0.2,0.1) button2.bind(on_press=self.pauza_video1) self.layout.add_widget(button2) button3 = Button(text='stop video1', font_size=14) button3.size_hint=(0.2,0.1) button3.bind(on_press=self.stop_video1) self.layout.add_widget(button3) button4 = Button(text='la 1/3 din film', font_size=14) button4.size_hint=(0.2,0.1) button4.bind(on_press=self.un_sfert_video1) self.layout.add_widget(button4) button5 = Button(text='la 2/3 din film', font_size=14) button5.size_hint=(0.2,0.1) button5.bind(on_press=self.doua_sferturi_video1) self.layout.add_widget(button5) button6 = Button(text='volum : -', font_size=14) button6.size_hint=(0.2,0.1) button6.bind(on_press=self.minus_video1) self.layout.add_widget(button6) button7 = Button(text='volum : +', font_size=14) button7.size_hint=(0.2,0.1) button7.bind(on_press=self.plus_video1) self.layout.add_widget(button7) return self.layout def play_video1 (self,buton): self.video.state='play' def pauza_video1 (self,buton): self.video.state='pause' def stop_video1 (self,buton): self.video.state='stop' def un_sfert_video1 (self,buton): self.video.seek(0.33) def doua_sferturi_video1 (self,buton): self.video.seek(0.66) def minus_video1 (self,buton): if (self.video.volume>0): self.video.volume -=0.1 def plus_video1 (self,buton): if (self.video.volume<1): self.video.volume +=0.1
class VideoShotApp(App): def build(self): return Builder.load_file("ui.kv") def on_start(self, *args): self.videoplayer = VideoPlayer(source="", allow_fullscreen=False) self.root.ids.mainfloat.add_widget(self.videoplayer) keyboard.on_press_key("right", self.rightpressed) keyboard.on_press_key("left", self.leftpressed) keyboard.on_press_key("space", self.spacepressed) def rightpressed(self, *args): new_value = (((self.videoplayer.position - 0) / (self.videoplayer.duration - 0)) * (1 - 0) + 0) + 0.0019 self.videoplayer.seek(new_value, precise=True) def leftpressed(self, *args): new_value = (((self.videoplayer.position - 0) / (self.videoplayer.duration - 0)) * (1 - 0) + 0) - 0.0019 self.videoplayer.seek(new_value, precise=True) def spacepressed(self, *args): if self.videoplayer.state == "stop" or self.videoplayer.state == "pause": self.videoplayer.state = "play" elif self.videoplayer.state == "play": self.videoplayer.state = "pause" def getFrame(self, ms): self.vidcap.set(cv2.CAP_PROP_POS_MSEC, ms) hasFrames, image = self.vidcap.read() savewindow = Tk() savewindow.geometry("0x0") filename = filedialog.asksaveasfilename(title='Save Image As', filetypes=(('JPEG File', '*.jpg'), ('All Files', '*.*'))) if filename.endswith(".jpg"): filename = filename[:-4] cv2.imwrite(filename + ".jpg", image) # Save frame as JPG file savewindow.destroy() return hasFrames def screenshot(self, *args): ms = self.videoplayer.position * 1000 self.getFrame(ms) def loadvideo(self, *args): openwindow = Tk() openwindow.geometry("0x0") openfilename = filedialog.askopenfilename(title="Choose a Video File", filetypes=(("MP4 Files", "*.mp4"), ('All Files', '*.*'))) self.videoplayer.source = openfilename self.video = openfilename self.vidcap = cv2.VideoCapture(openfilename) openwindow.destroy()
class AppBase(RelativeLayout): def __init__(self, filename, **kwargs): super(AppBase, self).__init__(**kwargs) self.padding = 20 self._keyboard = Window.request_keyboard(self._keyboard_closed, self, 'text') self._keyboard.bind(on_key_down=self._on_keyboard_down) self.v = VideoPlayer(source=filename, state='stop') self.add_widget(self.v) self.label = Label() self.label.pos_hint = {'center_x': .8, 'center_y': .8} self.label.color = (0, 255, 0, 1) self.label.font_size = '30sp' self.add_widget(self.label) self.rect_label = None self.time_label = Label(pos_hint={'center_x': .3, 'center_y': .2}, font_size='20sp', color=(1, 1, 1, 1)) self.add_widget(self.time_label) self.rect_label = Label(pos_hint={'center_x': .5, 'center_y': .5}, text='', font_size='50sp', color=(1, 1, 1, 1)) self.add_widget(self.rect_label) self.rect = None self.value = 0.0 self.last_position = None self.frameGaps = collections.deque([0.1], maxlen=10) self.framegap = 0.0 self.updated = False self.customspeed = False self.speed = 2.0 self.draw_rect = False self.bind(pos=self.on_resize, size=self.on_resize) def _keyboard_closed(self): print('My keyboard have been closed!') self._keyboard.unbind(on_key_down=self._on_keyboard_down) self._keyboard = None def _on_keyboard_down(self, keyboard, keycode, text, modifiers): # print 'The key', keycode[1], 'have been pressed' # print(' - text is %r' % text) # print(' - modifiers are %r' % modifiers) if keycode[1] == 'h': self.draw_rect = True elif keycode[1] == 'g': self.draw_rect = False elif keycode[1] == 's': self.custom_play_pause() elif keycode[1] == 'left': self.play_pause(force=True) self.step_video(False) self.label.text = "<< Step backward" elif keycode[1] == 'right': self.play_pause(force=True) self.step_video(True) self.label.text = "Step forward >>" elif keycode[1] == 'spacebar': self.play_pause() elif keycode[1] == 'enter': self.v.state = 'stop' self.v.seek(0.0) self.label.text = '' elif keycode[1] == 'escape': sys.exit(1) elif keycode[1] == 'pageup': if self.speed < 16.0: self.speed *= 2.0 if self.speed == 1.0: self.speed = 2.0 elif keycode[1] == 'pagedown': if self.speed > 1.0 / 16.0: self.speed /= 2.0 if self.speed == 1.0: self.speed = 0.5 # Return True to accept the key. Otherwise, it will be used by # the system. return True def play_pause(self, force=False): if force: Clock.unschedule(self.update) Clock.unschedule(self.custom_update) self.v.state = 'pause' self.customspeed = False self.label.text = 'Pause ||' else: if self.customspeed: self.custom_play_pause() if self.v.state == 'play': self.v.state = 'pause' Clock.unschedule(self.update) self.label.text = 'Pause ||' else: self.v.state = 'play' Clock.schedule_interval(self.update, 0.0) # Schedule at max interval (once per frame) self.label.text = 'Play >' def custom_play_pause(self): if self.v.state == 'play': self.play_pause() if self.customspeed is False: self.customspeed = True Clock.schedule_interval(self.custom_update, 0.0) else: self.customspeed = False Clock.unschedule(self.custom_update) self.label.text = 'Pause ||' def step_video(self, direction, step_size=0.05): if direction: self.value = (self.v.position + step_size) / self.v.duration else: self.value = (self.v.position - step_size) / self.v.duration self.v.seek(self.value) self.tickReset() self.on_draw() def on_draw(self): if self.rect is None and self.draw_rect: with self.canvas: Color(1, 0, 0, 0.3, mode='rgba') self.rect = Rectangle(pos=(self.padding, self.padding), size=(self.width - 2 * self.padding, self.height - 2 * self.padding)) self.rect_label.text = 'Objects' elif self.rect is not None and not self.draw_rect: self.canvas.remove(self.rect) self.rect_label.text = '' self.rect = None # self.canvas.clear() self.time_label.text = "Time: %.4f" % self.v.position # print self.rect_label is None def on_resize(self, *args): if self.rect is not None: self.rect.pos = (self.padding, self.padding) self.rect.size = (self.width - 2 * self.padding, self.height - 2 * self.padding) def tick(self): if self.last_position is None: self.last_position = self.v.position else: if self.v.position > self.last_position: self.frameGaps.append(self.v.position - self.last_position) self.last_position = self.v.position self.updated = True def _frameGap(self): if self.updated: self.framegap = np.mean(self.frameGaps) self.updated = False def tickReset(self): '''To prevent frame calculation error when custom play''' self.last_position = None def update(self, dt): self.tick() self.on_draw() def custom_update(self, dt): if self.v.position + 0.5 > self.v.duration: self.tickReset() self.play_pause() else: self._frameGap() self.step_video(True, step_size=self.framegap * self.speed) if self.speed > 1: self.label.text = 'Custom speed x %d ' % int(self.speed) else: self.label.text = 'Custom speed x 1/%d ' % int(1/self.speed)