2011-11-04 17 views
1

我有使用Python,PyGObject(GTK 3)一個項目,GStreamer的(0.11)不能疊加在視頻的Gstreamer與Gtk.Overlay

我在我的應用程序的視頻,所以我使用的是Gtk.Overlay小部件,以便我可以將其他視覺元素放在視頻背景上。 (我需要這個,相信我。)(由於小部件的數量以及對這些小部件的具體定位和覆蓋的需要,我使用的是一個Gtk.Fixed容器。)

但是,在使用Gtk .Overlay對象通過「overlay.add_overlay(widget)」添加了任何內容,視頻不再可見。我仍然可以聽到它,但我看不到它。

下面的代碼。

from gi.repository import Gtk, Gdk, GdkPixbuf, GdkX11 
import pango 
import pygst 
pygst.require('0.10') 
import gst 
import Trailcrest 
import os, sys 
import cairo 
from math import pi 

class Video: 

    def __init__(self): 

     def on_message(bus, message): 
      if message.type == gst.MESSAGE_EOS: 
       # End of Stream 
       player.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, gst.SEEK_TYPE_SET, 5000000000, gst.SEEK_TYPE_NONE, 6000000000) 
      elif message.type == gst.MESSAGE_ERROR: 
       player.set_state(gst.STATE_NULL) 
       (err, debug) = message.parse_error() 
       print "Error: %s" % err, debug 

     def on_sync_message(bus, message): 
      if message.structure is None: 
       return False 
      if message.structure.get_name() == "prepare-xwindow-id": 
       Gdk.threads_enter() 
       Gdk.Display.get_default().sync() 
       win_id = videowidget.get_property('window').get_xid() 
       imagesink = message.src 
       imagesink.set_property("force-aspect-ratio", True) 
       imagesink.set_xwindow_id(win_id) 
       Gdk.threads_leave() 

     def click_me(event, data=None): 
      player.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, gst.SEEK_TYPE_SET, 5000000000, gst.SEEK_TYPE_NONE, 6000000000) 

     win = Gtk.Window() 
     win.set_resizable(False) 
     win.set_decorated(False) 
     win.set_position(Gtk.WindowPosition.CENTER) 

     overlay = Gtk.Overlay() 
     win.add(overlay) 
     overlay.show() 

     videowidget = Gtk.DrawingArea() 
     overlay.add(videowidget) 
     videowidget.set_halign (Gtk.Align.START) 
     videowidget.set_valign (Gtk.Align.START) 
     videowidget.set_size_request(640, 480) 
     videowidget.show() 

     fixed = Gtk.Fixed() 
     overlay.add_overlay(fixed) 
     fixed.show() 

     pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size("IMG/IMG-MPG-LOGO.png", 250, 50) 
     imgMPL = Gtk.Image() 
     imgMPL.set_from_pixbuf(pixbuf) 
     eb_imgMPL = Gtk.EventBox() 
     eb_imgMPL.set_visible_window(False) 
     eb_imgMPL.add(imgMPL) 
     fixed.put(eb_imgMPL, 10, 10) 
     imgMPL.show() 
     eb_imgMPL.show() 

     win.show_all() 

     # Setup GStreamer 
     player = gst.element_factory_make("playbin", "MultimediaPlayer") 
     bus = player.get_bus() 
     bus.add_signal_watch() 
     bus.enable_sync_message_emission() 
     #used to get messages that GStreamer emits 
     bus.connect("message", on_message) 
     #used for connecting video to your application 
     bus.connect("sync-message::element", on_sync_message) 
     player.set_property("uri", "file://" + os.getcwd() + "/VID/BGA-HABT-001.ogv") 
     player.set_state(gst.STATE_PLAYING) 


if __name__ == "__main__": 
    Gdk.threads_enter() 
    Video() 
    Gtk.main() 

如何解決這個小問題?

回答

1

Answer derived from GNOME Bugzilla Bug 663589, Comments 1-3.

至關重要的是要設置通過 「add_overlay」 添加任何物體的VALIGN和halign。

因此,聲明和添加Gtk.Fixed對象的修訂代碼如下所示。

fixed = Gtk.Fixed() 

#The following two lines were added. 
fixed.set_halign(Gtk.Align.START) 
fixed.set_valign(Gtk.Align.START) 

overlay.add_overlay(fixed) 
fixed.show()