Advertisement
Guest User

pygst webcam video diary code

a guest
Apr 12th, 2010
608
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.50 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import sys, os
  4. import pygtk, gtk
  5. import gobject
  6. import pygst
  7. pygst.require("0.10")
  8. import gst
  9.  
  10. class GTK_Main:
  11.  
  12.     def __init__(self):
  13.         window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  14.         window.set_title("Webcam-Viewer")
  15.         window.set_default_size(500, 400)
  16.         window.connect("destroy", gtk.main_quit, "WM destroy")
  17.         vbox = gtk.VBox()
  18.         window.add(vbox)
  19.         self.movie_window = gtk.DrawingArea()
  20.         vbox.add(self.movie_window)
  21.         hbox = gtk.HBox()
  22.         vbox.pack_start(hbox, False)
  23.         hbox.set_border_width(10)
  24.         hbox.pack_start(gtk.Label())
  25.         self.button = gtk.Button("Start")
  26.         self.button.connect("clicked", self.start_stop)
  27.         hbox.pack_start(self.button, False)
  28.         self.button2 = gtk.Button("Quit")
  29.         self.button2.connect("clicked", self.exit)
  30.         hbox.pack_start(self.button2, False)
  31.         hbox.add(gtk.Label())
  32.         window.show_all()
  33.  
  34.         # Set up the gstreamer pipeline
  35.         self.full_pipe = gst.Pipeline("full_pipe")
  36.  
  37.         #########################################################
  38.         # Play/view path bin
  39.         #########################################################
  40.         self.play_bin = gst.Bin("play_bin")
  41.         # Video source
  42.         self.autov4l2src = gst.element_factory_make("v4l2src", "autov4l2src")
  43.         # for other webcam self.autov4l2src = gst.element_factory_make("v4lsrc", "autov4l2src")
  44.         self.play_bin.add(self.autov4l2src)
  45.         # Scaler - Not really used right now though
  46.         self.scaler = gst.element_factory_make("videoscale", "scaler")
  47.         self.play_bin.add(self.scaler)
  48.         self.autov4l2src.link(self.scaler)
  49.         #cn_new = gst.caps_from_string('video/x-raw-yuv, format=(fourcc)I420, width=(int)352, height=(int)288, framerate=(fraction)9/1')
  50.         cn_new = gst.caps_new_any()
  51.         # Tee element
  52.         self.tee = gst.element_factory_make("tee", "tee0")
  53.         self.play_bin.add(self.tee)
  54.         self.scaler.link(self.tee, cn_new)
  55.         # Queue for play path
  56.         self.play_queue = gst.element_factory_make("queue", "play_queue")
  57.         self.play_bin.add(self.play_queue)
  58.         self.tee.link(self.play_queue)
  59.         # Element for displaying video
  60.         self.sink = gst.element_factory_make("autovideosink", "sink")
  61.         self.play_bin.add(self.sink)
  62.         self.play_queue.link(self.sink)
  63.         # Encode path queue, that will also be the GhostPad for the play Bin
  64.         self.enc_queue = gst.element_factory_make("queue", "enc_queue")
  65.         self.play_bin.add(self.enc_queue)
  66.         self.tee.link(self.enc_queue)
  67.         # Main ghost pad for the play Bin
  68.         self.play_bin_src_gp = gst.GhostPad("src", self.enc_queue.get_pad('src'))
  69.         self.play_bin.add_pad(self.play_bin_src_gp)
  70.  
  71.         #########################################################
  72.         # Encode path bin
  73.         #########################################################
  74.         self.enc_bin = gst.Bin("enc_bin")
  75.         # Theora encoder element, will also be the sink ghost pad for the encode path
  76.         self.bitstream = gst.element_factory_make("theoraenc", "video_bitstream")
  77.         self.enc_bin.add(self.bitstream)
  78.         self.enc_bin_sink_gp = gst.GhostPad("src", self.bitstream.get_pad('sink'))
  79.         self.enc_bin.add_pad(self.enc_bin_sink_gp)
  80.         # Ogg container element.  The video stream (and eventually audio) will be muxed into this container
  81.         self.container = gst.element_factory_make("oggmux", "video_container")
  82.         self.enc_bin.add(self.container)
  83.         self.bitstream.link(self.container)
  84.         # File sink element where the ogg container file is written
  85.         self.file = gst.element_factory_make("filesink", "outputfile")
  86.         self.enc_bin.add(self.file)
  87.         self.file.set_property("location", "testoutput.ogv")
  88.         self.container.link(self.file)
  89.  
  90.         # Add the play and enc Bin elements to the pipeline
  91.         self.full_pipe.add(self.play_bin)
  92.         #self.full_pipe.add(self.enc_bin)
  93.         #self.play_bin.link(self.enc_bin)
  94.        
  95.         bus = self.full_pipe.get_bus()
  96.         bus.add_signal_watch()
  97.         bus.enable_sync_message_emission()
  98.         bus.connect("message", self.on_message)
  99.         bus.connect("sync-message::element", self.on_sync_message)
  100.  
  101.         self.full_pipe.set_state(gst.STATE_PLAYING)
  102.  
  103. #    def encodeAddLinkCb(self, ghost, blocked):
  104. #        if blocked:
  105. #            self.full_pipe.add(self.enc_bin)
  106. #            self.play_bin.link(self.enc_bin)
  107. #            self.tee.get_pad('sink').set_blocked(False)
  108. #            
  109. #            
  110.  
  111.     def start_stop(self, w):
  112.         if self.button.get_label() == "Start":
  113. #            self.tee.get_pad('sink').set_blocked_async(True, self.encodeAddLinkCb)
  114.             self.button.set_label("Stop")
  115.             self.tee.get_pad('sink').set_blocked(True)
  116.             self.full_pipe.add(self.enc_bin)
  117.             self.play_bin.link(self.enc_bin)
  118.             synced = self.enc_bin.sync_state_with_parent()
  119.             if not synced:
  120.                 # bail
  121.                 gtk.main_quit()
  122.                 pass
  123.             self.tee.get_pad('sink').set_blocked(False)
  124.         else:
  125.             #self.full_pipe.set_state(gst.STATE_NULL)
  126.             self.tee.get_pad('sink').set_blocked(True)
  127.             self.play_bin.unlink(self.enc_bin)
  128.             self.full_pipe.remove(self.enc_bin)
  129.             self.tee.get_pad('sink').set_blocked(False)
  130.             #self.full_pipe.set_state(gst.STATE_PLAYING)
  131.             self.button.set_label("Start")
  132.  
  133.     def exit(self, widget, data=None):
  134.         gtk.main_quit()
  135.  
  136.     def on_message(self, bus, message):
  137.         t = message.type
  138.         if t == gst.MESSAGE_EOS:
  139.             self.full_pipe.set_state(gst.STATE_NULL)
  140.             self.button.set_label("Start")
  141.         elif t == gst.MESSAGE_ERROR:
  142.             err, debug = message.parse_error()
  143.             print "Error: %s" % err, debug
  144.             self.full_pipe.set_state(gst.STATE_NULL)
  145.             self.button.set_label("Start")
  146.  
  147.     def on_sync_message(self, bus, message):
  148.         if message.structure is None:
  149.             return
  150.         message_name = message.structure.get_name()
  151.         if message_name == "prepare-xwindow-id":
  152.             # Assign the viewport
  153.             imagesink = message.src
  154.             imagesink.set_property("force-aspect-ratio", True)
  155.             imagesink.set_xwindow_id(self.movie_window.window.xid)
  156.  
  157. GTK_Main()
  158. gtk.gdk.threads_init()
  159. gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement