def is_loaded(self): self.loading = False self.loaded = True self.unloading = False self._video = Video(filename=self.file) self._video.bind(on_load=self._check_duration) self._call_callbacks()
def is_loaded(self): self.loading = False self.loaded = True self.unloading = False self._video = Video(filename=self.file) self._video.bind(on_load=self._check_duration) if isinstance(self._video, VideoNull): raise AssertionError( "Kivy cannot load video {} because there is no provider.". format(self.file)) self._call_callbacks()
def on_source(self, instance, value): if not value: self._video = None self.texture = None else: filename = resource_find(value) self._video = CoreVideo(filename=filename) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame) if self.play: self._video.play() self.duration = 1. self.position = 0.
def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = resource_find(self.source) self._video = CoreVideo(filename=filename, **self.options) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1.0 self.position = 0.0
def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = resource_find(self.source) self._video = CoreVideo(filename=filename, **self.options) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1. self.position = 0.
def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # FIXME make it extensible. if filename.split(":")[0] not in ("http", "https", "file", "udp", "rtp", "rtsp"): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1.0 self.position = 0.0
def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source if filename.split(':')[0] not in ('http', 'https', 'file'): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1. self.position = 0.
def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # FIXME make it extensible. if filename.split(':')[0] not in ('http', 'https', 'file', 'udp', 'rtp', 'rtsp'): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1. self.position = 0.
def _do_video_load(self, *largs): if CoreVideo is None: return self.unload() if not self.source: self._video = None self.texture = None else: filename = self.source # Check if filename is not url if '://' not in filename: filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_load, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.state == 'play' or self.play: self._video.play() self.duration = 1. self.position = 0.
def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # FIXME make it extensible. if filename.split(':')[0] not in ( 'http', 'https', 'file', 'udp', 'rtp', 'rtsp'): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_load, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.state == 'play' or self.play: self._video.play() self.duration = 1. self.position = 0.
class Video(Image): '''Video class. See module documentation for more information. ''' play = BooleanProperty(False) '''Boolean, indicates if the video is playing. You can start/stop the video by setting this property. :: # start playing the video at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :data:`play` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' eos = BooleanProperty(False) '''Boolean, indicates if the video is done playing (reached end of stream). :data:`eos` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :data:`duration`. The position is default to -1, and set to real position when the video is loaded. :data:`position` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration is default to -1, and set to real duration when the video is loaded. :data:`duration` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 mean full volume, 0 mean mute. :data:`volume` is a :class:`~kivy.properties.NumericProperty`, default to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :data:`options` is a :class:`kivy.properties.ObjectProperty`, default to {}. ''' def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) def texture_update(self, *largs): '''This method is a no-op in Video widget. ''' pass def seek(self, percent): '''Change the position to a percentage of duration. Percentage must be a value between 0-1. .. warning:: Calling seek() before video is loaded have no impact. .. versionadded:: 1.1.2 ''' if self._video is None: raise Exception('Video not loaded.') print 'seek to', percent self._video.seek(percent) def on_source(self, instance, value): self._trigger_video_load() def _trigger_video_load(self, *largs): Clock.unschedule(self._do_video_load) Clock.schedule_once(self._do_video_load, -1) def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # FIXME make it extensible. if filename.split(':')[0] not in ( 'http', 'https', 'file', 'udp', 'rtp', 'rtsp'): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): if not self._video: return if value: if self.eos: self._video.stop() self._video.position = 0. self._video.eos = False self.eos = False self._video.play() else: self._video.stop() def _on_video_frame(self, *largs): self.duration = self._video.duration self.position = self._video.position self.texture = self._video.texture self.canvas.ask_update() def _on_eos(self, *largs): self.play = False self.eos = True def on_volume(self, instance, value): if self._video: self._video.volume = value
class Video(Image): '''Video class. See module documentation for more information. ''' play = BooleanProperty(False) '''Boolean, indicates if the video is playing. You can start/stop the video by setting this property. :: # start playing the video at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :data:`play` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' eos = BooleanProperty(False) '''Boolean, indicates if the video is done playing (reached end of stream). :data:`eos` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :data:`duration`. The position is default to -1, and set to real position when the video is loaded. :data:`position` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration is default to -1, and set to real duration when the video is loaded. :data:`duration` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 mean full volume, 0 mean mute. :data:`volume` is a :class:`~kivy.properties.NumericProperty`, default to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :data:`options` is a :class:`kivy.properties.ObjectProperty`, default to {}. ''' def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) def texture_update(self, *largs): '''This method is a no-op in Video widget. ''' pass def seek(self, percent): '''Change the position to a percentage of duration. Percentage must be a value between 0-1. .. warning:: Calling seek() before video is loaded have no impact. .. versionadded:: 1.2.0 ''' if self._video is None: raise Exception('Video not loaded.') self._video.seek(percent) def on_source(self, instance, value): self._trigger_video_load() def _trigger_video_load(self, *largs): Clock.unschedule(self._do_video_load) Clock.schedule_once(self._do_video_load, -1) def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # FIXME make it extensible. if filename.split(':')[0] not in ( 'http', 'https', 'file', 'udp', 'rtp', 'rtsp'): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): if not self._video: return if value: if self.eos: self._video.stop() self._video.position = 0. self._video.eos = False self.eos = False self._video.play() else: self._video.stop() def _on_video_frame(self, *largs): self.duration = self._video.duration self.position = self._video.position self.texture = self._video.texture self.canvas.ask_update() def _on_eos(self, *largs): self.play = False self.eos = True def on_volume(self, instance, value): if self._video: self._video.volume = value
class Video(Image): '''Video class. See module documentation for more information. ''' state = OptionProperty('stop', options=('play', 'pause', 'stop')) '''String, indicates whether to play, pause, or stop the video:: # start playing the video at creation video = Video(source='movie.mkv', state='play') # create the video, and start later video = Video(source='movie.mkv') # and later video.state = 'play' :attr:`state` is an :class:`~kivy.properties.OptionProperty` and defaults to 'stop'. ''' play = BooleanProperty(False) ''' .. deprecated:: 1.4.0 Use :attr:`state` instead. Boolean, indicates whether the video is playing or not. You can start/stop the video by setting this property:: # start playing the video at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :attr:`play` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. .. deprecated:: 1.4.0 Use :attr:`state` instead. ''' eos = BooleanProperty(False) '''Boolean, indicates whether the video has finished playing or not (reached the end of the stream). :attr:`eos` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' loaded = BooleanProperty(False) '''Boolean, indicates whether the video is loaded and ready for playback or not. .. versionadded:: 1.6.0 :attr:`loaded` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :attr:`duration`. The position defaults to -1 and is set to a real position when the video is loaded. :attr:`position` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration defaults to -1, and is set to a real duration when the video is loaded. :attr:`duration` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 means full volume, 0 means mute. :attr:`volume` is a :class:`~kivy.properties.NumericProperty` and defaults to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :attr:`options` is an :class:`kivy.properties.ObjectProperty` and defaults to {}. ''' def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) self.fbind('source', self._trigger_video_load) if "eos" in kwargs: self.options["eos"] = kwargs["eos"] if self.source: self._trigger_video_load() def seek(self, percent): '''Change the position to a percentage of duration. Percentage must be a value between 0-1. .. warning:: Calling seek() before the video is loaded has no impact. .. versionadded:: 1.2.0 ''' if self._video is None: raise Exception('Video not loaded.') self._video.seek(percent) def _trigger_video_load(self, *largs): Clock.unschedule(self._do_video_load) Clock.schedule_once(self._do_video_load, -1) def _do_video_load(self, *largs): if CoreVideo is None: return if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # Check if filename is not url if not '://' in filename: filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_load, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.state == 'play' or self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): value = 'play' if value else 'stop' return self.on_state(instance, value) def on_state(self, instance, value): if not self._video: return if value == 'play': if self.eos: self._video.stop() self._video.position = 0. self._video.eos = False self.eos = False self._video.play() elif value == 'pause': self._video.pause() else: self._video.stop() self._video.position = 0 self._video.eos = False def _on_video_frame(self, *largs): video = self._video if not video: return self.duration = video.duration self.position = video.position self.texture = video.texture self.canvas.ask_update() def _on_eos(self, *largs): if self._video.eos != 'loop': self.state = 'stop' self.eos = True def _on_load(self, *largs): self.loaded = True self._on_video_frame(largs) def on_volume(self, instance, value): if self._video: self._video.volume = value def unload(self): '''Unload the video. The playback will be stopped. .. versionadded:: 1.8.0 ''' if self._video: self._video.stop() self._video.unload() self._video = None
class Video(Image): '''Video class. See module documentation for more information. ''' state = OptionProperty('stop', options=('play', 'pause', 'stop')) '''String, indicates whether to play, pause, or stop the video:: # start playing the video at creation video = Video(source='movie.mkv', state='play') # create the video, and start later video = Video(source='movie.mkv') # and later video.state = 'play' :attr:`state` is an :class:`~kivy.properties.OptionProperty` and defaults to 'stop'. ''' play = BooleanProperty(False) ''' .. deprecated:: 1.4.0 Use :attr:`state` instead. Boolean, indicates whether the video is playing or not. You can start/stop the video by setting this property:: # start playing the video at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :attr:`play` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. .. deprecated:: 1.4.0 Use :attr:`state` instead. ''' eos = BooleanProperty(False) '''Boolean, indicates whether the video has finished playing or not (reached the end of the stream). :attr:`eos` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' loaded = BooleanProperty(False) '''Boolean, indicates whether the video is loaded and ready for playback or not. .. versionadded:: 1.6.0 :attr:`loaded` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :attr:`duration`. The position defaults to -1 and is set to a real position when the video is loaded. :attr:`position` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration defaults to -1, and is set to a real duration when the video is loaded. :attr:`duration` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 means full volume, 0 means mute. :attr:`volume` is a :class:`~kivy.properties.NumericProperty` and defaults to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :attr:`options` is an :class:`kivy.properties.ObjectProperty` and defaults to {}. ''' _video_load_event = None def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) self.fbind('source', self._trigger_video_load) if "eos" in kwargs: self.options["eos"] = kwargs["eos"] if self.source: self._trigger_video_load() def seek(self, percent, precise=True): '''Change the position to a percentage of duration. :Parameters: `percent`: float or int Position to seek, must be between 0-1. `precise`: bool, defaults to True Precise seeking is slower, but seeks to exact requested percent. .. warning:: Calling seek() before the video is loaded has no effect. .. versionadded:: 1.2.0 .. versionchanged:: 1.10.1 The `precise` keyword argument has been added. ''' if self._video is None: raise Exception('Video not loaded.') self._video.seek(percent, precise=precise) def _trigger_video_load(self, *largs): ev = self._video_load_event if ev is None: ev = self._video_load_event = Clock.schedule_once( self._do_video_load, -1) ev() def _do_video_load(self, *largs): if CoreVideo is None: return self.unload() if not self.source: self._video = None self.texture = None else: filename = self.source # Check if filename is not url if '://' not in filename: filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_load, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.state == 'play' or self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): value = 'play' if value else 'stop' return self.on_state(instance, value) def on_state(self, instance, value): if not self._video: return if value == 'play': if self.eos: self._video.stop() self._video.position = 0. self._video.eos = False self.eos = False self._video.play() elif value == 'pause': self._video.pause() else: self._video.stop() self._video.position = 0 self._video.eos = False def _on_video_frame(self, *largs): video = self._video if not video: return self.duration = video.duration self.position = video.position self.texture = video.texture self.canvas.ask_update() def _on_eos(self, *largs): if self._video.eos != 'loop': self.state = 'stop' self.eos = True def _on_load(self, *largs): self.loaded = True self._on_video_frame(largs) def on_volume(self, instance, value): if self._video: self._video.volume = value def unload(self): '''Unload the video. The playback will be stopped. .. versionadded:: 1.8.0 ''' if self._video: self._video.stop() self._video.unload() self._video = None self.loaded = False
class Video(Image): '''Video class. See module documentation for more information. ''' state = OptionProperty('stop', options=('play', 'pause', 'stop')) '''String, indicates whether to play, pause, or stop the video:: # start playing the video at creation video = Video(source='movie.mkv', state='play') # create the video, and start later video = Video(source='movie.mkv') # and later video.state = 'play' :data:`state` is a :class:`~kivy.properties.OptionProperty`, default to 'play'. ''' play = BooleanProperty(False) ''' .. deprecated:: 1.4.0 Use :data:`state` instead. Boolean, indicates if the video is playing. You can start/stop the video by setting this property:: # start playing the video at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :data:`play` is a :class:`~kivy.properties.BooleanProperty`, default to False. .. deprecated:: 1.4.0 Use :data:`state` instead. ''' eos = BooleanProperty(False) '''Boolean, indicates if the video is done playing (reached end of stream). :data:`eos` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' loaded = BooleanProperty(False) '''Boolean, indicates if the video is loaded and ready for playback. .. versionadded:: 1.6.0 :data:`loaded` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :data:`duration`. The position defaults to -1, and is set to a real position when the video is loaded. :data:`position` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration defaults to -1, and is set to a real duration when the video is loaded. :data:`duration` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 means full volume, 0 means mute. :data:`volume` is a :class:`~kivy.properties.NumericProperty`, default to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :data:`options` is a :class:`kivy.properties.ObjectProperty`, default to {}. ''' def __init__(self, **kwargs): self._video = None super(Image, self).__init__(**kwargs) self.bind(source=self._trigger_video_load) if self.source: self._trigger_video_load() def seek(self, percent): '''Change the position to a percentage of duration. Percentage must be a value between 0-1. .. warning:: Calling seek() before video is loaded has no impact. .. versionadded:: 1.2.0 ''' if self._video is None: raise Exception('Video not loaded.') self._video.seek(percent) def _trigger_video_load(self, *largs): Clock.unschedule(self._do_video_load) Clock.schedule_once(self._do_video_load, -1) def _do_video_load(self, *largs): if CoreVideo is None: return if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # FIXME make it extensible. if filename.split(':')[0] not in ( 'http', 'https', 'file', 'udp', 'rtp', 'rtsp'): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_load, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.state == 'play' or self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): value = 'play' if value else 'stop' return self.on_state(instance, value) def on_state(self, instance, value): if not self._video: return if value == 'play': if self.eos: self._video.stop() self._video.position = 0. self._video.eos = False self.eos = False self._video.play() elif value == 'pause': self._video.pause() else: self._video.stop() self._video.position = 0 self._video.eos = False def _on_video_frame(self, *largs): self.duration = self._video.duration self.position = self._video.position self.texture = self._video.texture self.canvas.ask_update() def _on_eos(self, *largs): if self._video.eos != 'loop': self.state = 'stop' self.eos = True def _on_load(self, *largs): self.loaded = True self._on_video_frame(largs) def on_volume(self, instance, value): if self._video: self._video.volume = value
class Video(Image): '''Video class. See module documentation for more informations. ''' play = BooleanProperty(False) '''Boolean indicate if the video is playing. You can start/stop the video by setting this property. :: # start the video playing at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :data:`play` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' eos = BooleanProperty(False) '''Boolean indicate if the video is done playing through the end. :data:`eos` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :data:`duration`. The position is default to -1, and set to real position when the video is loaded. :data:`position` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration is default to -1, and set to real duration when the video is loaded. :data:`duration` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 mean full volume, 0 mean mute. :data:`volume` is a :class:`~kivy.properties.NumericProperty`, default to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :data:`options` is a :class:`kivy.properties.ObjectProperty`, default to {}. ''' def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) def texture_update(self, *largs): pass def on_source(self, instance, value): self._trigger_video_load() def _trigger_video_load(self, *largs): Clock.unschedule(self._do_video_load) Clock.schedule_once(self._do_video_load, -1) def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = resource_find(self.source) self._video = CoreVideo(filename=filename, **self.options) self._video.bind( on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): if not self._video: return if value: if self.eos: self._video.stop() self._video.position = 0. self._video.eos = False self._video.play() else: self._video.stop() def _on_video_frame(self, *largs): self.duration = self._video.duration self.position = self._video.position self.texture = self._video.texture self.canvas.ask_update() def _on_eos(self, *largs): self.eos = True def on_volume(self, instance, value): if self._video: self._video.volume = value
class Video(Image): '''Video class. See module documentation for more informations. ''' play = BooleanProperty(False) '''Boolean indicate if the video is playing. You can start/stop the video by setting this property. :: # start the video playing at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :data:`play` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' eos = BooleanProperty(False) '''Boolean indicate if the video is done playing through the end. :data:`eos` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :data:`duration`. The position is default to -1, and set to real position when the video is loaded. :data:`position` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration is default to -1, and set to real duration when the video is loaded. :data:`duration` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 mean full volume, 0 mean mute. :data:`volume` is a :class:`~kivy.properties.NumericProperty`, default to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :data:`options` is a :class:`kivy.properties.ObjectProperty`, default to {}. ''' def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) def on_source(self, instance, value): self._trigger_video_load() def _trigger_video_load(self, *largs): Clock.unschedule(self._do_video_load) Clock.schedule_once(self._do_video_load, -1) def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = resource_find(self.source) self._video = CoreVideo(filename=filename, **self.options) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): if not self._video: return if value: if self.eos: self._video.stop() self._video.position = 0. self._video.eos = False self._video.play() else: self._video.stop() def _on_video_frame(self, *largs): self.duration = self._video.duration self.position = self._video.position self.texture = self._video.texture self.canvas.ask_update() def _on_eos(self, *largs): self.eos = True def on_volume(self, instance, value): if self._video: self._video.volume = value
class Video(Image): '''Video class. See module documentation for more informations. ''' play = BooleanProperty(False) '''Boolean indicate if the video is playing. You can start/stop the video by setting this property. :: # start the video playing at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :data:`play` is a :class:`~kivy.properties.BooleanProperty`, default to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :data:`duration`. The position is default to -1, and set to real position when the video is loaded. :data:`position` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration is default to -1, and set to real duration when the video is loaded. :data:`duration` is a :class:`~kivy.properties.NumericProperty`, default to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 mean full volume, 0 mean mute. :data:`volume` is a :class:`~kivy.properties.NumericProperty`, default to 1. ''' def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) def on_source(self, instance, value): if not value: self._video = None self.texture = None else: filename = resource_find(value) self._video = CoreVideo(filename=filename) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame) if self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): if not self._video: return if value: self._video.play() else: self._video.stop() def _on_video_frame(self, *largs): self.duration = self._video.duration self.position = self._video.position self.texture = self._video.texture
class Video(Image): """Video class. See module documentation for more information. """ play = BooleanProperty(False) """Boolean, indicates if the video is playing. You can start/stop the video by setting this property. :: # start playing the video at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :data:`play` is a :class:`~kivy.properties.BooleanProperty`, default to False. """ eos = BooleanProperty(False) """Boolean, indicates if the video is done playing (reached end of stream). :data:`eos` is a :class:`~kivy.properties.BooleanProperty`, default to False. """ position = NumericProperty(-1) """Position of the video between 0 and :data:`duration`. The position is default to -1, and set to real position when the video is loaded. :data:`position` is a :class:`~kivy.properties.NumericProperty`, default to -1. """ duration = NumericProperty(-1) """Duration of the video. The duration is default to -1, and set to real duration when the video is loaded. :data:`duration` is a :class:`~kivy.properties.NumericProperty`, default to -1. """ volume = NumericProperty(1.0) """Volume of the video, in the range 0-1. 1 mean full volume, 0 mean mute. :data:`volume` is a :class:`~kivy.properties.NumericProperty`, default to 1. """ options = ObjectProperty({}) """Options to pass at Video core object creation. .. versionadded:: 1.0.4 :data:`options` is a :class:`kivy.properties.ObjectProperty`, default to {}. """ def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) def texture_update(self, *largs): """This method is a no-op in Video widget. """ pass def on_source(self, instance, value): self._trigger_video_load() def _trigger_video_load(self, *largs): Clock.unschedule(self._do_video_load) Clock.schedule_once(self._do_video_load, -1) def _do_video_load(self, *largs): if self._video: self._video.stop() if not self.source: self._video = None self.texture = None else: filename = self.source # FIXME make it extensible. if filename.split(":")[0] not in ("http", "https", "file", "udp", "rtp", "rtsp"): filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.bind(on_load=self._on_video_frame, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.play: self._video.play() self.duration = 1.0 self.position = 0.0 def on_play(self, instance, value): if not self._video: return if value: if self.eos: self._video.stop() self._video.position = 0.0 self._video.eos = False self.eos = False self._video.play() else: self._video.stop() def _on_video_frame(self, *largs): self.duration = self._video.duration self.position = self._video.position self.texture = self._video.texture self.canvas.ask_update() def _on_eos(self, *largs): self.play = False self.eos = True def on_volume(self, instance, value): if self._video: self._video.volume = value
class VideoAsset(Asset): attribute = 'videos' path_string = 'videos' config_section = 'videos' extensions = ('mkv', 'avi', 'mpg', 'mp4', 'm4v', 'mov') class_priority = 100 pool_config_section = 'video_pools' asset_group_class = VideoPool def __init__(self, mc, name, file, config): self._video = None super().__init__(mc, name, file, config) @property def video(self): return self._video def do_load(self): # For videos, we need them to load in the main thread, so we do not # load them here and load them via is_loaded() below. pass def _do_unload(self): if self._video: self._video.stop() self._video.unload() self._video = None def set_end_behavior(self, eos='stop'): assert eos in ('loop', 'pause', 'stop') self._video.eos = eos def is_loaded(self): self.loading = False self.loaded = True self.unloading = False self._video = Video(filename=self.file) self._video.bind(on_load=self._check_duration) if isinstance(self._video, VideoNull): raise AssertionError( "Kivy cannot load video {} because there is no provider.". format(self.file)) self._call_callbacks() def _check_duration(self, instance): del instance if self._video and self._video.duration <= 0: raise ValueError( "Video file {} was loaded, but seems to have no content. Check" " to make sure you have the proper Gstreamer plugins for the " "codec this video needs".format(self.file)) # # Properties # def _get_position(self): try: return self._video.position except AttributeError: return 0 def _set_position(self, pos): # position in secs try: self._video.position = pos except AttributeError: pass position = AliasProperty(_get_position, _set_position) '''Position of the video between 0 and :attr:`duration`. The position defaults to -1 and is set to a real position when the video is loaded. :attr:`position` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' def _get_duration(self): try: return self._video.duration except AttributeError: return 0 duration = AliasProperty(_get_duration, None) '''Duration of the video. The duration defaults to -1, and is set to a real duration when the video is loaded. :attr:`duration` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' def _get_volume(self): try: return self._video.volume except AttributeError: return 0 def _set_volume(self, volume): # float 0.0 - 1.0 try: self._video.volume = volume except AttributeError: pass volume = AliasProperty(_get_volume, _set_volume) '''Volume of the video, in the range 0-1. 1 means full volume, 0 means mute. :attr:`volume` is a :class:`~kivy.properties.NumericProperty` and defaults to 1. ''' def _get_state(self): return self._video.state state = AliasProperty(_get_state, None) '''String, indicates whether to play, pause, or stop the video::
class Video(Image): '''Video class. See module documentation for more information. ''' preview = StringProperty(None, allownone=True) '''Filename / source of a preview image displayed before video starts. :attr:`preview` is a :class:`~kivy.properties.StringProperty` and defaults to None. If set, it gets displayed until the video is loaded/started. .. versionadded:: 2.1.0 ''' state = OptionProperty('stop', options=('play', 'pause', 'stop')) '''String, indicates whether to play, pause, or stop the video:: # start playing the video at creation video = Video(source='movie.mkv', state='play') # create the video, and start later video = Video(source='movie.mkv') # and later video.state = 'play' :attr:`state` is an :class:`~kivy.properties.OptionProperty` and defaults to 'stop'. ''' play = BooleanProperty(False, deprecated=True) ''' .. deprecated:: 1.4.0 Use :attr:`state` instead. Boolean, indicates whether the video is playing or not. You can start/stop the video by setting this property:: # start playing the video at creation video = Video(source='movie.mkv', play=True) # create the video, and start later video = Video(source='movie.mkv') # and later video.play = True :attr:`play` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. .. deprecated:: 1.4.0 Use :attr:`state` instead. ''' eos = BooleanProperty(False) '''Boolean, indicates whether the video has finished playing or not (reached the end of the stream). :attr:`eos` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' loaded = BooleanProperty(False) '''Boolean, indicates whether the video is loaded and ready for playback or not. .. versionadded:: 1.6.0 :attr:`loaded` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' position = NumericProperty(-1) '''Position of the video between 0 and :attr:`duration`. The position defaults to -1 and is set to a real position when the video is loaded. :attr:`position` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' duration = NumericProperty(-1) '''Duration of the video. The duration defaults to -1, and is set to a real duration when the video is loaded. :attr:`duration` is a :class:`~kivy.properties.NumericProperty` and defaults to -1. ''' volume = NumericProperty(1.) '''Volume of the video, in the range 0-1. 1 means full volume, 0 means mute. :attr:`volume` is a :class:`~kivy.properties.NumericProperty` and defaults to 1. ''' options = ObjectProperty({}) '''Options to pass at Video core object creation. .. versionadded:: 1.0.4 :attr:`options` is an :class:`kivy.properties.ObjectProperty` and defaults to {}. ''' _video_load_event = None def __init__(self, **kwargs): self._video = None super(Video, self).__init__(**kwargs) self.fbind('source', self._trigger_video_load) if "eos" in kwargs: self.options["eos"] = kwargs["eos"] if self.source: self._trigger_video_load() def texture_update(self, *largs): if self.preview: self.set_texture_from_resource(self.preview) else: self.set_texture_from_resource(self.source) def seek(self, percent, precise=True): '''Change the position to a percentage (strictly, a proportion) of duration. :Parameters: `percent`: float or int Position to seek as a proportion of the total duration, must be between 0-1. `precise`: bool, defaults to True Precise seeking is slower, but seeks to exact requested percent. .. warning:: Calling seek() before the video is loaded has no effect. .. versionadded:: 1.2.0 .. versionchanged:: 1.10.1 The `precise` keyword argument has been added. ''' if self._video is None: raise Exception('Video not loaded.') self._video.seek(percent, precise=precise) def _trigger_video_load(self, *largs): ev = self._video_load_event if ev is None: ev = self._video_load_event = Clock.schedule_once( self._do_video_load, -1) ev() def _do_video_load(self, *largs): if CoreVideo is None: return self.unload() if not self.source: self._video = None self.texture = None else: filename = self.source # Check if filename is not url if '://' not in filename: filename = resource_find(filename) self._video = CoreVideo(filename=filename, **self.options) self._video.volume = self.volume self._video.bind(on_load=self._on_load, on_frame=self._on_video_frame, on_eos=self._on_eos) if self.state == 'play' or self.play: self._video.play() self.duration = 1. self.position = 0. def on_play(self, instance, value): value = 'play' if value else 'stop' return self.on_state(instance, value) def on_state(self, instance, value): if not self._video: return if value == 'play': if self.eos: self._video.stop() self._video.position = 0. self.eos = False self._video.play() elif value == 'pause': self._video.pause() else: self._video.stop() self._video.position = 0 def _on_video_frame(self, *largs): video = self._video if not video: return self.duration = video.duration self.position = video.position self.texture = video.texture self.canvas.ask_update() def _on_eos(self, *largs): if not self._video or self._video.eos != 'loop': self.state = 'stop' self.eos = True def _on_load(self, *largs): self.loaded = True self._on_video_frame(largs) def on_volume(self, instance, value): if self._video: self._video.volume = value def unload(self): '''Unload the video. The playback will be stopped. .. versionadded:: 1.8.0 ''' if self._video: self._video.stop() self._video.unload() self._video = None self.loaded = False
class VideoAsset(Asset): attribute = 'videos' path_string = 'videos' config_section = 'videos' extensions = ('mkv', 'avi', 'mpg', 'mp4', 'm4v', 'mov') class_priority = 100 pool_config_section = 'video_pools' asset_group_class = VideoPool def __init__(self, mc, name, file, config): super().__init__(mc, name, file, config) self._video = None @property def video(self): return self._video @property def position(self): try: return self._video.position except AttributeError: return 0 @position.setter def position(self, pos): # position in secs try: self._video.position = pos except AttributeError: pass @property def duration(self): try: return self._video.duration except AttributeError: return 0 @property def volume(self): try: return self._video.volume except AttributeError: return 0 @volume.setter def volume(self, volume): # float 0.0 - 1.0 try: self._video.volume = volume except AttributeError: pass @property def state(self): return self._video.state def do_load(self): # For videos, we need them to load in the main thread, so we do not # load them here and load them via is_loaded() below. pass def _do_unload(self): if self._video: self._video.stop() self._video.unload() self._video = None def play(self): self._video.play() def stop(self): self._video.stop() def pause(self): self._video.pause() def seek(self, percent): self._video.seek(percent) def set_end_behavior(self, eos='stop'): assert eos in ('loop', 'pause', 'stop') self._video.eos = eos def is_loaded(self): self.loading = False self.loaded = True self.unloading = False self._video = Video(filename=self.file) self._video.bind(on_load=self._check_duration) self._call_callbacks() def _check_duration(self, instance): del instance if self._video.duration <= 0: raise ValueError( "Video file {} was loaded, but seems to have no content. Check" " to make sure you have the proper Gstreamer plugins for the " "codec this video needs".format(self.file))