[Glade-devel] embedding video in drawing area
- From: timovwb at gmail.com (Timo)
- Subject: [Glade-devel] embedding video in drawing area
- Date: Tue, 21 Feb 2012 10:47:30 +0100
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]