在GStreamer视频上叠加其他GUI元素

时间:2011-10-14 03:53:46

标签: python video pygtk gstreamer

我有一个用Python,PyGTK 2.24和PyGST(GStreamer)构建的项目。我的视频在gtk.DrawingArea对象中完美运行。

但是,我需要在播放时在该视频上显示其他GUI元素。 (请不要问为什么,请相信我。)现在,他们似乎都落后了。在代码中,视频对象(和gtk.DrawingArea)被声明并放入gtk.Fixed FIRST,然后是其他所有内容。

那么,我该怎么做?我是否需要更改GStreamer正在播放的对象?我知道这是可能的......我见过GStreamer程序,其中包含按钮和标签之类的东西。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您可以使用GtkOverlay在GTK 3.2及更高版本中执行此操作。

如果你无法升级,那么这里是老式方式的摘要:连接到expose-event的{​​{1}}信号,并使用Cairo绘制自己的信息。当信息更改时,使用DrawingArea触发绘图区域的重绘。确保您的处理程序在将实际视频绘制到绘图区域之后的之后运行。这适用于标签和非交互式GUI元素。

如果您希望实际运行的GUI元素悬停在视频上方,那就更复杂了,我不知道该怎么做。我认为widget.queue_draw()不保证任何z顺序。我怀疑你的按钮和诸如此类的东西被绘制到绘图区域的视频所覆盖,因此可能会触发重新绘制Fixed处理程序中的那些按钮。

答案 1 :(得分:2)

可能对OP毫无用处,但我搜索了很长时间以寻找一种方法将小部件放在gtk.gdk.Drawable元素的顶部(可能是静态绘制的图像,动画或视频)之前我终于想出了如何在pygtk2中做到这一点。

以下是我提出的链接:http://bazaar.launchpad.net/~damien-moore/picty/trunk/view/642/modules/picty/overlay_widgets.py

这包括3个自定义类:

ProportionalLayout:自定义gtk.Container的一个实现,它允许用户使用比例定位子窗口小部件。

DrawableOverlay:一个EventBox,它发出一个'draw'事件供用户连接并进行绘图,并在顶部显示ProportionalLayout。

DrawableOverlayHover:一个DrawableOverlayHover,只有当指针“接近”它们时才显示小部件。

示例 main 程序说明了如何使用它们。代码应该相当简单,以适应视频应用程序。