Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/VideoJAM.activity/videojam.py
diff options
context:
space:
mode:
Diffstat (limited to 'VideoJAM.activity/videojam.py')
-rw-r--r--VideoJAM.activity/videojam.py223
1 files changed, 223 insertions, 0 deletions
diff --git a/VideoJAM.activity/videojam.py b/VideoJAM.activity/videojam.py
new file mode 100644
index 0000000..a2d0e74
--- /dev/null
+++ b/VideoJAM.activity/videojam.py
@@ -0,0 +1,223 @@
+#!/usr/bin/python
+#-*- encoding: UTF-8 -*-
+''' Script para ver la cámara, sacar fotos, grabar sonido y escucharlo
+ Basado en http://pygstdocs.berlios.de/pygst-tutorial/webcam-viewer.html
+'''
+
+#Copyright (C) 2009 Federico Moreira - <federico@piensalibre.info>
+# Alejandro Esperón - <ratman26@gmail.com>
+# Pablo Moleri - <pmoleri@gmail.com>
+# Daniel Berniger - <berniger@gmail.com>
+# Santiago Aguiar - <santiago.aguiar@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>
+
+import time
+import os
+import subprocess
+import signal
+import gtk
+import pygst
+pygst.require("0.10")
+import gst
+
+class VentanaMultimedia(gtk.Frame):
+ ''' Clase para ver la cámara, sacar fotos, grabar audio y escucharlo '''
+
+ def __init__(self):
+ gtk.Frame.__init__(self, None)
+
+ self.recording = False
+ self.rec_process = None
+
+ vbox = gtk.VBox()
+ self.add(vbox)
+
+ self.movie_window = gtk.DrawingArea()
+ vbox.add(self.movie_window)
+ hbox = gtk.HBox()
+ vbox.pack_start(hbox, False)
+ hbox.set_border_width(10)
+ hbox.pack_start(gtk.Label())
+
+ self.btn_prender = gtk.Button("Prender")
+ self.btn_prender.connect("clicked", self.start_stop)
+ hbox.pack_start(self.btn_prender, False)
+
+ self.btn_tomar = gtk.Button("Tomar foto")
+ self.btn_tomar.connect("clicked", self.take_pic)
+ hbox.pack_start(self.btn_tomar, False)
+
+ self.btn_record = gtk.Button("Grabar Sonido")
+ self.btn_record.connect("clicked", self.record_sound)
+ hbox.pack_start(self.btn_record, False)
+
+ self.btn_listen = gtk.Button("Escuchar Sonido")
+ self.btn_listen.connect("clicked", self.listen_record)
+ hbox.pack_start(self.btn_listen, False)
+
+ self.btn_salir = gtk.Button("Salir")
+ self.btn_salir.connect("clicked", self.exit)
+ hbox.pack_start(self.btn_salir, False)
+ hbox.add(gtk.Label())
+ self.show_all()
+
+ # Set up the gstreamer pipeline
+ #self.player = gst.parse_launch ("v4l2src ! autovideosink")
+ self.player = gst.parse_launch ("udpsrc port=5000 ! smokedec ! ffmpegcolorspace ! autovideosink")
+
+ bus = self.player.get_bus()
+ bus.add_signal_watch()
+ bus.enable_sync_message_emission()
+ bus.connect("message", self.on_message)
+ bus.connect("sync-message::element", self.on_sync_message)
+
+ self.tx_players = {}
+
+ def start_stop(self, dummy_widget):
+ ''' Comienza o detiene la camara '''
+ if self.btn_prender.get_label() == "Prender":
+ self.btn_prender.set_label("Apagar")
+ self.player.set_state(gst.STATE_PLAYING)
+ else:
+ self.player.set_state(gst.STATE_NULL)
+ self.btn_prender.set_label("Prender")
+
+ def exit(self, dummy_widget, dummy_data=None):
+ ''' Sale del programa '''
+ print "Usted pulsó el botón %s" % self.btn_prender.get_label()
+ self.player.set_state(gst.STATE_NULL)
+ for player in self.tx_players:
+ player.set_state(gst.STATE_NULL)
+ gtk.main_quit()
+
+ def on_message(self, dummy_bus, message):
+ ''' Agregar descripción '''
+ tipo_mensaje = message.type
+ if tipo_mensaje == gst.MESSAGE_EOS:
+ self.player.set_state(gst.STATE_NULL)
+ self.btn_prender.set_label("Prender")
+ elif tipo_mensaje == gst.MESSAGE_ERROR:
+ err, debug = message.parse_error()
+ print "Error: %s" % err, debug
+ self.player.set_state(gst.STATE_NULL)
+ self.btn_prender.set_label("Prender")
+
+ def on_sync_message(self, dummy_bus, message):
+ ''' Agregar descripción '''
+ if message.structure is None:
+ return
+ message_name = message.structure.get_name()
+ if message_name == "prepare-xwindow-id":
+ # Assign the viewport
+ imagesink = message.src
+ imagesink.set_property("force-aspect-ratio", True)
+ imagesink.set_xwindow_id(self.movie_window.window.xid)
+
+ def take_pic(self, dummy_widget):
+ ''' Para la reproducción de la cámara y toma una foto '''
+ self.player.set_state(gst.STATE_PAUSED)
+ pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 320, 240)
+ pixbuf.get_from_drawable(self.movie_window.window,
+ self.movie_window.get_colormap(),
+ 0, 0, 0, 0, 320, 240)
+ file_loc = "/tmp/%d" % time.time()
+ pixbuf.save(file_loc, 'png')
+ print "La foto la encuentras en %s" % file_loc
+ self.player.set_state(gst.STATE_PLAYING)
+
+ def record_sound(self, dummy_widget):
+ ''' Graba un sonido usando arecord '''
+ if self.recording is False:
+ file_name = '/tmp/wav'
+ self.rec_process = subprocess.Popen(['/usr/bin/arecord',
+ '--file-type=wav',
+ '--channels=1',
+ '--format=S16',
+ '--rate=48000', file_name])
+ file_size = 0
+ while file_size <= 0:
+ try:
+ file_size = os.path.getsize(file_name)
+ except os.error:
+ time.sleep(0.02)
+
+ self.recording = True
+ self.btn_record.set_label("Detener Grabación")
+
+ else:
+ os.kill(self.rec_process.pid, signal.SIGKILL)
+ self.rec_process.wait()
+ self.recording = False
+ self.btn_record.set_label("Grabar Sonido")
+
+ def listen_record(self, dummy_widget):
+ ''' Reproduce un sonido con aplay '''
+ try:
+ subprocess.Popen(['/usr/bin/aplay', '/tmp/wav'])
+ except IOError, exception:
+ print exception
+ print self.recording
+
+ def buddy_left(self, buddy):
+ buddy_id = buddy.props.ip4_address
+ player = self.tx_players.get(buddy_id)
+ if player is not None:
+ player.set_state(gst.STATE_NULL)
+ del self.tx_players[buddy_id]
+
+ def joined(self):
+ if self.player:
+ self.player.set_state(gst.STATE_PLAYING)
+
+ def buddy_joined(self, buddy):
+ nick = buddy.props.nick
+ ip = buddy.props.ip4_address
+ print "Se conecto el companero: %s con ip: %s" % (nick, ip)
+ # * Gets all the general properties of the buddy
+ # * Returns: a dbus dict of buddy properties, like nickname, realname, IP address, whether or not this buddy is the laptop owner, etc
+ # http://wiki.laptop.org/go/Presence_Service_D-Bus_API#org.laptop.Sugar.Presence.Buddy#Methods
+
+ port = 5000
+ parms = "v4l2src ! video/x-raw-yuv, width=320,height=240,framerate=10/1 ! ffmpegcolorspace ! smokeenc keyframe=8 qmax=40 ! udpsink host=%s port=%s" % (ip, port)
+ print "ejecutando comando:" + parms
+ if ip not in self.tx_players:
+ player = gst.parse_launch (parms)
+ player.set_state(gst.STATE_PLAYING)
+ self.tx_players[ip] = player
+
+def init(sugar, window):
+ window.set_title("Ver video")
+ window.set_default_size(500, 400)
+ window.connect("destroy", gtk.main_quit, "WM destroy")
+
+ frame = VentanaMultimedia()
+ if sugar:
+ window.set_canvas(frame)
+ window.collaboration.set_up(
+ frame.buddy_joined,
+ frame.buddy_left,
+ frame.joined,
+ )
+ else:
+ window.add(frame)
+
+ window.show()
+
+ gtk.gdk.threads_init()
+
+if __name__ == '__main__':
+ window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ init(False, window)
+ gtk.main()