【发布时间】:2014-09-13 13:07:56
【问题描述】:
在我的程序中,我使用 PyGObject/PyGI 和 GStreamer 在我的 GUI 中显示视频。该视频显示在Gtk.DrawingArea 中,因此我需要在realize-signal-handler 中获取它的窗口句柄。在 Linux 上,我使用:
drawing_area.get_property('window').get_xid()
但是如何在 Windows 上获取句柄?
我在互联网上进行了搜索,但仅找到了使用 window.handle 的 PyGtk 示例,而使用 PyGI 则无法使用。
GStreamer 文档提供了一个example,它使用GDK_WINDOW_HWND 宏来获取句柄。此宏使用 AFAIK gdk_win32_drawable_get_handle。但是如何使用 PyGI 在 Python 中做到这一点呢?
15-07-28 更新:添加(简化)代码
我仍然无法在 Windows 上播放视频。
问题 1:我无法在 _on_video_realize() 中获取窗口句柄。
问题 2: _on_player_sync_message() 方法永远不会被调用。
class MultimediaPlayer:
def __init__(self):
# ... some init stuff ...
self._drawing_area.connect('realize', self._on_video_realize)
self._drawing_area.connect('unrealize', self._on_video_unrealize)
# GStreamer setup
# ---------------
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')
# The xid must be retrieved first in GUI-thread and before
# playing pipeline.
if sys.platform == "win32":
self._drawing_area.get_property('window').ensure_native()
# -------------------------------------------------------------
# TODO [PROBLEM 1] How to get handle here?
# self._drawing_area.GetHandle() does not exist!
# -------------------------------------------------------------
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):
# ... handle some messages here ...
def _on_player_sync_message(self, bus, message):
# ---------------------------------------------------------------------
# TODO [PROBLEM 2] This method is never called on Windows after opening
# a video_file! But on Linux it is!
# ---------------------------------------------------------------------
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)
【问题讨论】:
标签: python gstreamer gtk3 pygobject python-gstreamer