[Glade-devel] embedding video in drawing area



Op 20-02-12 23:27, Patrick schreef:
Hi Everyone this is my first post here.

I downloaded the complete source files to build Trisquel Linux(based 
off Ubuntu). I found many glade/ui files in the projects and have many 
sample applications to study but unfortunately I could not find an 
example of embedding video, even with totem.

I also downloaded this pygtk book:
http://svn.majorsilence.com/pygtknotebook/trunk/pygtk-notebook-latest.pdf

On page 89 it describes how to embed video with gstreamer. The samples 
worked well for me but I am having trouble moving the concepts from 
hand-coded GTK to glade.  Are there any examples of this sort of thing 
with glade?

This is asking too much but could someone possibly explain how to turn 
a glade drawing area into a video widget? I understand that gstreamer 
is emitting signals to synchronize the drawing widget but I don't 
understand how the video actually gets drawn or is wired in to the 
application.
Do you know how to build an interface with Glade and use it with 
Python/PyGTK? If so, this shouldn't be hard at all.
Create your interface with Glade, including the drawing area. Then in 
your code, replace
         self.videowidget = gtk.DrawingArea()
from the below example, to:
         self.videowidget = builder.get_object('drawingarea') # where 
builder is your gtk.Builder instance and 'drawingarea' is the name of 
your drawingarea in Glade

Now you use self.videowidget the same as in the example, especially that 
last method is important:
             win_id = self.videowidget.window.xid
             # ...
             imagesink.set_xwindow_id(win_id)

Cheers,
Timo


Here is the code from the book that I am struggling with. Thanks for 
reading-Patrick :

#!/usr/bin/python
import pygst
pygst.require("0.10")
import gst
import pygtk
import gtk
import sys


class Main(object):
    def __init__(self):
        self.multimedia_file=""

        # Create the GUI
        self.win = gtk.Window()
        self.win.set_title("Play Video Example")
        self.win.connect("delete_event", lambda w,e: gtk.main_quit())

        vbox = gtk.VBox(False, 0)
        hbox = gtk.HBox(False, 0)

        self.load_file = gtk.FileChooserButton("Choose Audio File")
        self.play_button = gtk.Button("Play", gtk.STOCK_MEDIA_PLAY)
        self.pause_button = gtk.Button("Pause", gtk.STOCK_MEDIA_PAUSE)
        self.stop_button = gtk.Button("Stop", gtk.STOCK_MEDIA_STOP)

        self.videowidget = gtk.DrawingArea()
        self.videowidget.set_size_request(400, 250)

        self.load_file.connect("selection-changed", 
self.on_file_selected)
        self.play_button.connect("clicked", self.on_play_clicked)
        self.pause_button.connect("clicked", self.on_pause_clicked)
        self.stop_button.connect("clicked", self.on_stop_clicked)

        hbox.pack_start(self.play_button, False, True, 0)
        hbox.pack_start(self.pause_button, False, True, 0)
        hbox.pack_start(self.stop_button, False, True, 0)

        vbox.pack_start(self.load_file, False, True, 0)
        vbox.pack_start(self.videowidget, True, True, 0) # You want to 
expand the video widget or else you cannot see it
        vbox.pack_start(hbox, False, True, 0)
        self.win.add(vbox)

        self.win.show_all()

        # Setup GStreamer
        self.player = gst.element_factory_make("playbin", 
"MultimediaPlayer")

        bus = self.player.get_bus()
        bus.add_signal_watch()
        bus.enable_sync_message_emission()

        #used to get messages that gstreamer emits
        bus.connect("message", self.on_message)

        #used for connecting video to your application
        bus.connect("sync-message::element", self.on_sync_message)

    def on_file_selected(self, widget):
        print "Selected: ", self.load_file.get_filename()
        self.multimedia_file = self.load_file.get_filename()

    def on_play_clicked(self, widget):
        print "play"
        self.player.set_property('uri', "file://" + self.multimedia_file)
        self.player.set_state(gst.STATE_PLAYING)

    def on_pause_clicked(self, widget):
        print "pause"
        self.player.set_state(gst.STATE_PAUSED)

    def on_stop_clicked(self, widget):
        print "stop"
        self.player.set_state(gst.STATE_NULL)

    def on_message(self, bus, message):
        if message.type == gst.MESSAGE_EOS: # End of Stream
            self.player.set_state(gst.STATE_NULL)
        elif message.type == gst.MESSAGE_ERROR:
            self.player.set_state(gst.STATE_NULL)
            (err, debug) = message.parse_error()
            print "Error: %s" % err, debug

    def on_sync_message(self, bus, message):
        if message.structure is None:
            return False
        if message.structure.get_name() == "prepare-xwindow-id":
            if sys.platform == "win32":
                win_id = self.videowidget.window.handle
            else:
                win_id = self.videowidget.window.xid
            assert win_id
            imagesink = message.src
            imagesink.set_property("force-aspect-ratio", True)
            imagesink.set_xwindow_id(win_id)

if __name__ == "__main__":
    Main()
    gtk.main()


_______________________________________________
Glade-devel maillist  -  Glade-devel at lists.ximian.com
http://lists.ximian.com/mailman/listinfo/glade-devel




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]