diff options
Diffstat (limited to 'VideoJAM.activity/videojam.py')
-rw-r--r-- | VideoJAM.activity/videojam.py | 223 |
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() |