In my program, I use PyGObject / PyGI and GStreamer to display videos in my GUI. The video is shown in Gtk.DrawingArea, and so I need to get its window handle in the realize-signal handler. On Linux, I get this handle using:
drawing_area.get_property('window').get_xid()
But how do I get a handle on Windows?
I searched on the Internet but found only examples for PyGtk using window.handlethat which does not work using PyGI.
The GStreamer documentation provides an example that uses a macro GDK_WINDOW_HWNDto retrieve a handle. This macro uses AFAIK gdk_win32_drawable_get_handle. But how to do it in Python using PyGI?
Update 15-07-28: Added (simplified) code.
I still do not get video playback for working in Windows.
Problem 1: I cannot get the window handle in _on_video_realize ().
Problem 2: The _on_player_sync_message () method is never called.
class MultimediaPlayer:
def __init__(self):
self._drawing_area.connect('realize', self._on_video_realize)
self._drawing_area.connect('unrealize', self._on_video_unrealize)
self._player = Gst.ElementFactory.make('playbin', 'MultimediaPlayer')
bus = self._player.get_bus()
bus.add_signal_watch()
bus.connect('message', self._on_player_message)
bus.enable_sync_message_emission()
bus.connect('sync-message::element', self._on_player_sync_message)
def _on_video_realize(self, widget):
print('----------> _on_video_realize')
if sys.platform == "win32":
self._drawing_area.get_property('window').ensure_native()
else:
self._wnd_hnd = (self._drawing_area.get_property('window')
.get_xid())
def _on_video_unrealize(self, widget):
self._player.set_state(Gst.State.NULL)
def _on_player_message(self, bus, message):
def _on_player_sync_message(self, bus, message):
print('----------> _on_player_sync_message')
if message.get_structure() is None:
return True
if message.get_structure().get_name() == "prepare-window-handle":
imagesink = message.src
imagesink.set_property("force-aspect-ratio", True)
imagesink.set_window_handle(self._wnd_hnd)
def play(self):
self._player.set_state(Gst.State.PLAYING)
def stop(self):
self._player.set_state(Gst.State.NULL)
def set_file(self, file):
self._player.set_property('uri', "file:///" + file)
source
share