Discussion:
embedding video in drawing area
Patrick
2012-02-20 22:27:27 UTC
Permalink
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.

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-***@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/glade-devel
Timo
2012-02-21 09:47:30 UTC
Permalink
Post by Patrick
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.
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
Post by Patrick
Here is the code from the book that I am struggling with. Thanks for
#!/usr/bin/python
import pygst
pygst.require("0.10")
import gst
import pygtk
import gtk
import sys
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)
print "Selected: ", self.load_file.get_filename()
self.multimedia_file = self.load_file.get_filename()
print "play"
self.player.set_property('uri', "file://" + self.multimedia_file)
self.player.set_state(gst.STATE_PLAYING)
print "pause"
self.player.set_state(gst.STATE_PAUSED)
print "stop"
self.player.set_state(gst.STATE_NULL)
if message.type == gst.MESSAGE_EOS: # End of Stream
self.player.set_state(gst.STATE_NULL)
self.player.set_state(gst.STATE_NULL)
(err, debug) = message.parse_error()
print "Error: %s" % err, debug
return False
win_id = self.videowidget.window.handle
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)
Main()
gtk.main()
_______________________________________________
http://lists.ximian.com/mailman/listinfo/glade-devel
_______________________________________________
Glade-devel maillist - Glade-***@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/glade-devel

Loading...