Я сделал почти то же самое и создал класс для него в Gtk3.Надеюсь, это поможет.
class Camera(Gtk.DrawingArea):
def __init__(self, type, filepath, ui_table, callback):
self.ui_table = ui_table
self.type = type
self.callback = callback
# create GStreamer pipeline
pipeline = Gst.Pipeline()
# create bus to get events from GStreamer pipeline
bus_camera = pipeline.get_bus()
bus_camera.add_signal_watch()
bus_camera.connect('message::eos', self.on_eos_Camera)
bus_camera.connect('message::error', self.on_error_Camera)
source = Gst.ElementFactory.make("rtspsrc", "source")
source.set_property("location", filepath)
source.set_property("latency", 0)
source.connect("pad-added", self.on_pad)
pipeline.add(source)
depay = Gst.ElementFactory.make("rtph264depay", "depay")
pipeline.add(depay)
source.link(depay)
dec = Gst.ElementFactory.make("fluh264dec", "dec")
pipeline.add(dec)
depay.link(dec)
sink = Gst.ElementFactory.make("xvimagesink", "sink")
sink.set_property("sync", False)
pipeline.add(sink)
dec.link(sink)
Gtk.DrawingArea.__init__(self)
# main drawingarea
self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
self.connect("button-press-event", self.drawingarea_methode)
# get screen size
screen = Gdk.Screen.get_default()
screen_size_x = screen.get_width()
screen_size_y = screen.get_height()
self.set_size_request(screen_size_x, screen_size_y)
# This is needed to make the video output in our DrawingArea:
bus_camera.enable_sync_message_emission()
bus_camera.connect('message', self.on_message_Camera)
bus_camera.connect('sync-message::element', self.on_sync_message_Camera)
self.source = source
self.depay = depay
self.pipeline = pipeline
def on_pad(self, rtspsrc, pad):
depaySinkPad = self.depay.get_static_pad('sink')
pad.link(depaySinkPad)
# clicked event onto drawingarea results in hiding the buttons
def drawingarea_methode(self, widget, event):
#print "Mouse clicked... at ", event.x, ", ", event.y
self.callback(self.type[-1])
def on_eos_Camera(self, bus, msg):
self.player_camera.seek_simple(
Gst.Format.TIME,
Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
0
)
def on_error_Camera(self, bus, msg):
print('on_error():', msg.parse_error())
def on_message_Camera(self, bus, message):
t = message.type
#print(t)
def on_sync_message_Camera(self, bus, msg):
if msg.get_structure().get_name() == 'prepare-window-handle':
msg.src.set_window_handle(self.xid_Camera)