player-backend-gstreamer-recorder.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from gi.repository import GObject, Gtk, Gst, Gt
  2. class PlayerBackendRecorder(GObject.GObject, Gt.PlayerBackend):
  3. __gtype_name__ = "PlayerBackendRecorder"
  4. @GObject.Property(type=str)
  5. def uri(self):
  6. return self._uri
  7. @uri.setter
  8. def uri(self, value):
  9. self._uri = value
  10. @GObject.Property(type=float)
  11. def volume(self):
  12. return self._volume
  13. @volume.setter
  14. def volume(self, value):
  15. self._volume = value
  16. @GObject.Property(type=bool, default=False)
  17. def playing(self):
  18. return self._playing
  19. @playing.setter
  20. def playing(self, value):
  21. self._playing = value
  22. if self._playing:
  23. self.start()
  24. else:
  25. self.stop()
  26. @GObject.Property(type=float)
  27. def buffer_fill(self):
  28. return self._buffer_fill
  29. @buffer_fill.setter
  30. def buffer_fill(self, value):
  31. self._buffer_fill = value
  32. def cb_uri_change(self, foo, bar):
  33. print (self.get_property("uri"))
  34. def start(self):
  35. self._playbin.set_state(Gst.State.PLAYING)
  36. def stop(self):
  37. self._playbin.set_state(Gst.State.NULL)
  38. def cb_gst_message(self, bus, msg, data=None):
  39. print("inhere")
  40. if msg == Gst.MessageType.BUFFERING:
  41. perc = msg.parse()
  42. if perc < 100:
  43. self._playbin.set_state(Gst.State.PAUSED)
  44. else:
  45. self._playbin.set_state(Gst.State.PLAYING)
  46. self.set_property("buffer-fill", perc/100.0)
  47. def __init__(self):
  48. self._uri = ""
  49. self._volume = 1.0
  50. self._playing = False
  51. self._buffer_fill = 1.0
  52. self._widget = None
  53. GObject.GObject.__init__(self)
  54. self.connect("notify::uri", self.cb_uri_change)
  55. Gst.init_check(None)
  56. self._playbin = Gst.ElementFactory.make("playbin")
  57. self._videosink = Gst.ElementFactory.make("gtksink")
  58. self._bus = self._playbin.get_bus()
  59. self._bus.add_watch(0, self.cb_gst_message)
  60. builder = Gtk.Builder()
  61. builder.add_from_file("/home/grindhold/git/gnome-twitch-player-gstreamer-recorder/player-backend-gstreamer-recorder.ui")
  62. self._widget = builder.get_object("recordbox")
  63. self._widget.add(self._videosink.get_property("widget"))
  64. self._playbin.set_property("video-sink", self._videosink)
  65. self.bind_property("uri", self._playbin, "uri")
  66. self.bind_property("volume", self._playbin, "volume")
  67. def do_get_widget(self):
  68. self.playing = True
  69. print (self.get_property("uri"))
  70. return self._widget