Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- import gi
- gi.require_version('Gst', '1.0')
- from gi.repository import GObject, Gst, Gtk
- # Needed for window.get_xid(), xvimagesink.set_window_handle(), respectively:
- from gi.repository import GdkX11, GstVideo
- GObject.threads_init()
- Gst.init(None)
- class Webcam:
- def __init__(self):
- self.window = Gtk.Window()
- self.window.connect('destroy', self.quit)
- self.window.set_default_size(800, 450)
- self.drawingarea = Gtk.DrawingArea()
- self.window.add(self.drawingarea)
- self.window.show_all()
- self.xid = self.drawingarea.get_property('window').get_xid()
- # Create GStreamer pipeline
- self.pipeline = Gst.Pipeline()
- # Create bus to get events from GStreamer pipeline
- self.bus = self.pipeline.get_bus()
- self.bus.add_signal_watch()
- self.bus.connect('message::error', self.on_error)
- # This is needed to make the video output in our DrawingArea:
- self.bus.enable_sync_message_emission()
- self.bus.connect('sync-message::element', self.on_sync_message)
- # Create GStreamer elements
- self.src = Gst.ElementFactory.make('autovideosrc', None)
- self.sink = Gst.ElementFactory.make('autovideosink', None)
- # Add elements to the pipeline
- self.pipeline.add(self.src)
- self.pipeline.add(self.sink)
- self.src.link(self.sink)
- def run(self):
- self.window.show_all()
- self.pipeline.set_state(Gst.State.PLAYING)
- Gtk.main()
- def quit(self, window):
- self.pipeline.set_state(Gst.State.NULL)
- Gtk.main_quit()
- def on_sync_message(self, bus, msg):
- if msg.get_structure().get_name() == 'prepare-window-handle':
- print('prepare-window-handle')
- msg.src.set_property('force-aspect-ratio', True)
- msg.src.set_window_handle(self.xid)
- def on_error(self, bus, msg):
- print('on_error():', msg.parse_error())
- webcam = Webcam()
- webcam.run()
Advertisement
Add Comment
Please, Sign In to add comment