X-Git-Url: https://git.ao2.it/experiments/gstreamer.git/blobdiff_plain/0a2c3a7fb0bea571aedb2edab0b9b40d66b9f420..8040464e24174de2fe5051fd9bd7912b95b4cd5c:/gst-trick-mode-looping-2.py diff --git a/gst-trick-mode-looping-2.py b/gst-trick-mode-looping-2.py new file mode 100755 index 0000000..03843c4 --- /dev/null +++ b/gst-trick-mode-looping-2.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python + +# Get a test sample with: +# youtube-dl -t http://www.youtube.com/watch?v=yWa-YXiSk2Y + +import sys + +import gobject +gobject.threads_init() + +import gst + + +class Player: + def __init__(self, filename, rate): + self._filename = filename + self._rate = rate + + self._player = gst.element_factory_make("playbin2", "player") + self._player.set_property("uri", filename) + self._player.connect("about-to-finish", self.on_about_to_finish) + + bus = self._player.get_bus() + bus.add_signal_watch() + bus.connect('message::state-changed', self.on_state_changed) + + def run(self): + self._player.set_state(gst.STATE_PLAYING) + loop = gobject.MainLoop() + loop.run() + + def on_about_to_finish(self, player): + sys.stderr.write(".") + player.set_property("uri", self._filename) + + # XXX do I need to re-set the rate here? + # If I uncomment the following line, the player hangs: + #self.set_rate(self._date) + + # And it even hangs if I set the seek_event manually using position=0: + #seek_event = gst.event_new_seek(self._rate, + # gst.FORMAT_TIME, + # gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, + # gst.SEEK_TYPE_SET, 0, + # gst.SEEK_TYPE_NONE, 0) + #self._player.send_event(seek_event) + + def on_state_changed(self, bus, msg): + if msg.src != self._player: + return + + print 'on_state_changed' + old_state, new_state, pending = msg.parse_state_changed() + print "%s -> %s" % (old_state, new_state) + if new_state == gst.STATE_PAUSED: + self.set_rate(self._rate) + + def set_rate(self, rate): + self._rate = rate + try: + position, format = self._player.query_position(gst.FORMAT_TIME) + except: + position = 0 + + # Create the seek event + if rate > 0: + seek_event = gst.event_new_seek(rate, + gst.FORMAT_TIME, + gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, + gst.SEEK_TYPE_SET, position, + gst.SEEK_TYPE_NONE, 0) + else: + seek_event = gst.event_new_seek(rate, + gst.FORMAT_TIME, + gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, + gst.SEEK_TYPE_SET, 0, + gst.SEEK_TYPE_SET, position) + + if seek_event: + self._player.send_event(seek_event) + gst.info("rate set to %s" % rate) + else: + gst.warining("change rate failed") + + +def main(args): + def usage(): + sys.stdout.write("usage: %s \n" % args[0]) + + if len(args) != 2: + usage() + sys.exit(1) + + if not gst.uri_is_valid(args[1]): + sys.stderr.write("Error: Invalid URI: %s\n" % args[1]) + sys.exit(1) + + player = Player(args[1], 3.0) + player.run() + +if __name__ == '__main__': + sys.exit(main(sys.argv))