From fd24c51bf5a6befa85b80ffa61c2cb6b65f649af Mon Sep 17 00:00:00 2001 From: flavio Date: Tue, 02 Oct 2012 22:20:31 +0000 Subject: Funcionando en xo 1.75 sugar 0.96.2 falta que guarde en el journal --- diff --git a/.gitignore b/.gitignore index 1b100fe..5f751a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dist/ *.pyc +*.bak diff --git a/DesktopGrab.py b/DesktopGrab.py index 6bf4f81..d68558c 100644 --- a/DesktopGrab.py +++ b/DesktopGrab.py @@ -47,35 +47,35 @@ gtk.gdk.threads_init() class DesktopGrab(gtk.Widget): """Simple Grabador de Escritorio, Versión 2.0 - + def set_audio_enabled(self, valor) Habilita/deshabilita el audio en la grabación. - + set_video_quality(self, resolucion) Configura calidad de video final. - + def record(self, location_path) Graba. - + def stop(self) Detiene la grabación.""" __gsignals__ = { "update":(gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_STRING,))} - + def __init__(self): - + gtk.Widget.__init__(self) - + self.resolution = "video/x-raw-yuv,width=640,height=480" # 800x600 640x480 320x240 - + self.pipeline = None self.update = None self.file_path = None self.enabled_sound = True self.info = None - + # Video self.ximagesrc = None self.ffmpegcolorspace = None @@ -83,7 +83,7 @@ class DesktopGrab(gtk.Widget): self.video_filter = None self.theoraenc = None self.queue_video = None - + # Sound self.alsasrc = None self.sound_filter = None @@ -93,21 +93,21 @@ class DesktopGrab(gtk.Widget): self.oggmux = None self.file = None self.bus = None - + self.x = 0 self.y = 0 self.width = int(gtk.gdk.screen_width()) self.height = int(gtk.gdk.screen_height()) - + def set_pipeline(self): """Crea el pipe para grabar desde x y autoaudio.""" - + if self.pipeline: del(self.pipeline) self.pipeline = None - + self.pipeline = gst.Pipeline("player") - + # Video self.ximagesrc = gst.element_factory_make('ximagesrc', "x11") self.ximagesrc.set_property('startx', self.x) @@ -124,7 +124,7 @@ class DesktopGrab(gtk.Widget): self.queue_video.set_property('max-size-buffers', 10000) self.queue_video.set_property('max-size-bytes', 0) self.queue_video.set_property('max-size-time', 0) - + # Sound self.alsasrc = gst.element_factory_make('alsasrc', "alsasrc") sound_caps = gst.Caps("audio/x-raw-int,width=16,depth=16,rate=8000,channels=1") @@ -136,28 +136,28 @@ class DesktopGrab(gtk.Widget): self.queue_sound.set_property('max-size-buffers', 10000) self.queue_sound.set_property('max-size-bytes', 0) self.queue_sound.set_property('max-size-time', 0) - + self.oggmux = gst.element_factory_make('oggmux', "oggmux") - + self.file = gst.element_factory_make('filesink', "file") self.file.set_property("location", self.file_path) - + if self.enabled_sound: self.add_todos() self.link_todos() else: self.add_solo_video() self.link_solo_video() - + self.bus = self.pipeline.get_bus() self.bus.enable_sync_message_emission() self.bus.add_signal_watch() self.bus.connect("sync-message::element", self.on_sync_message) self.bus.connect("message", self.on_message) - + def link_solo_video(self): """Linkea solo los elementos de video y archivo, no de audio.""" - + gst.element_link_many( self.ximagesrc, self.ffmpegcolorspace, @@ -167,10 +167,10 @@ class DesktopGrab(gtk.Widget): self.queue_video, self.oggmux, self.file) - + def link_todos(self): """Linkea todos los elementos del pipe, de audio, video y archivo.""" - + gst.element_link_many( self.ximagesrc, self.ffmpegcolorspace, @@ -179,7 +179,7 @@ class DesktopGrab(gtk.Widget): self.theoraenc, self.queue_video, self.oggmux) - + gst.element_link_many( self.alsasrc, self.sound_filter, @@ -187,14 +187,14 @@ class DesktopGrab(gtk.Widget): self.vorbisenc, self.queue_sound, self.oggmux) - + gst.element_link_many( self.oggmux, self.file) - + def add_todos(self): """Agrega al pipe todos los elementos, de audio y video.""" - + self.pipeline.add( self.ximagesrc, self.ffmpegcolorspace, @@ -209,10 +209,10 @@ class DesktopGrab(gtk.Widget): self.queue_sound, self.oggmux, self.file) - + def add_solo_video(self): """Agrega al pipe solo los elementos de video pero no de adio.""" - + self.pipeline.add( self.ximagesrc, self.ffmpegcolorspace, @@ -222,99 +222,96 @@ class DesktopGrab(gtk.Widget): self.queue_video, self.oggmux, self.file) - + def set_audio_enabled(self, valor): """Habilita y desabilita el audio en la grabación.""" - + self.stop() self.enabled_sound = valor - + def set_video_quality(self, resolution): """Configura la calidad de grabación de video.""" - + self.stop() - + w, h = resolution self.resolution = "video/x-raw-yuv,width=%i,height=%i" % (w,h) - + def on_sync_message(self, bus, message): """Captura mensajes en el bus.""" - + if message.structure is None: return - + def on_message(self, bus, message): """Captura mensajes en el bus.""" - + if message.type == gst.MESSAGE_ERROR: err, debug = message.parse_error() - # "ERROR ON_MESSAGE: ", err, debug + print "ERROR ON_MESSAGE: ", err, debug self.pipeline.set_state(gst.STATE_NULL) - + def record(self, location_path): """Comienza a Grabar.""" - + self.new_handle(False) - + if self.pipeline: self.pipeline.set_state(gst.STATE_PAUSED) self.pipeline.set_state(gst.STATE_NULL) - - """ - dat = datetime.date.today() - tim = time.strftime("%H-%M-%S") - self.file_path = os.path.join(location_path,"%s-%s.ogg" % (dat, tim)) - """ + self.file_path = location_path - + self.set_pipeline() - + self.pipeline.set_state(gst.STATE_PLAYING) - + self.new_handle(True) - + def stop(self): """Detiene la grabación.""" - + self.new_handle(False) - + if self.pipeline: self.pipeline.set_state(gst.STATE_PAUSED) self.pipeline.set_state(gst.STATE_NULL) - + self.estado = None - + def new_handle(self, reset): """Reinicia o mata el actualizador.""" - + if self.update: gobject.source_remove(self.update) self.update = None - + if reset: self.update = gobject.timeout_add(1000, self.handle) - + def handle(self): """Envía información periódicamente.""" - + if os.path.exists(self.file_path): tamanio = int(os.path.getsize(self.file_path)/1024) info = "Record: %s - %s Kb." % (str(self.file_path), str(tamanio)) - + if self.info != info: self.info = info self.emit('update', self.info) #print self.info - + return True if __name__=="__main__": - - #default_location = os.path.dirname(__file__) + grabador = DesktopGrab() grabador.set_audio_enabled(True) + dat = datetime.date.today() + tim = time.strftime("%H-%M-%S") if os.path.exists('/home/flavio'): - path = '/home/flavio' + path = os.path.join('/home/flavio',"%s-%s.ogg" % (dat, tim)) else: - path = '/home/olpc' + path = path = os.path.join('/home/olpc',"%s-%s.ogg" % (dat, tim)) grabador.record(path) gtk.main() + \ No newline at end of file diff --git a/screencast_activity.py b/screencast_activity.py index 4680c6d..c28f906 100644 --- a/screencast_activity.py +++ b/screencast_activity.py @@ -37,8 +37,7 @@ import gtk import screencast_ui # Process -#import screencast_process -import DesktopGrab +from DesktopGrab import DesktopGrab # GObject import gobject @@ -55,7 +54,6 @@ class ScreencastActivity(activity.Activity): # Attributes _ui = None - #_process = None _outfile = None _state = None @@ -71,7 +69,7 @@ class ScreencastActivity(activity.Activity): # Out file self._outfile = os.path.join( get_bundle_path(), "screencast.ogv" ) - + #self._outfile = os.path.join( '/home/olpc', "screencast.ogg" ) # Build GUI self._ui = screencast_ui.ScreencastUI(self) self._ui.buildGUI() @@ -80,45 +78,41 @@ class ScreencastActivity(activity.Activity): self._ui.showGUI() # Process - self._process = DesktopGrab.DesktopGrab() + self._process = DesktopGrab() self._process.connect('update', self.updateStatusbar) - #self._process = screencast_process.ScreencastProcess() - #self._process.connect('encode-start', self.startEncode) - #self._process.connect('encode-finished', self.finishEncode) - #self._process.connect('update-statusbar', self.updateStatusbar) # Connect UI signals self._ui.connect('record-button-clicked-signal', self.recordButtonClicked) self._ui.connect('stop-button-clicked-signal', self.stopButtonClicked) def recordButtonClicked(self, widget): - """ Record button clicked event - """ + """ Record button clicked event. """ + + ''' self._ui.changeButtonsState("record") if self._ui.isSoundCheckActive(): self._process.set_audio_enabled(True) else: - self._process.set_audio_enabled(False) - - #self._process.runProcess(self._ui.getCurrentQuality(), self._ui.isSoundCheckActive(), self._outfile) + self._process.set_audio_enabled(False)''' + self._process.set_audio_enabled(True) - self._process.set_video_quality((800,600)) + self._process.set_video_quality( (640,480) ) + self._ui.changeButtonsState(activate = "record") self._process.record(self._outfile) self._state = "record" def stopButtonClicked(self, widget): - """ Stop button clicked event - """ + """ Stop button clicked event """ + #self._ui.changeButtonsState("encode") - self._ui.changeButtonsState("stop") - #self._process.stopProcess() + self._ui.changeButtonsState(activate = "stop") self._process.stop() self._state = "stop" def updateStatusbar(self, widget, text): - """ Update status bar - """ + """ Update status bar """ + self._ui.changeStatusbarText(text) #def startEncode(self,widget): @@ -144,9 +138,8 @@ class ScreencastActivity(activity.Activity): # self._ui.updateProgressbar(percentage) def write_file(self, filePath): - """ Journal write file method - """ - + """ Journal write file method """ + if os.path.exists(self._outfile) and self._state == "stop": self.metadata['mime_type'] = 'video/ogg' @@ -159,8 +152,7 @@ class ScreencastActivity(activity.Activity): os.system(cmd) def can_close(self): - """ Close before verification - """ + """ Close before verification """ if self._state == "stop": return True diff --git a/screencast_ui.py b/screencast_ui.py index 2290dff..d58a097 100644 --- a/screencast_ui.py +++ b/screencast_ui.py @@ -188,12 +188,14 @@ class ScreencastUI(gobject.GObject): self._qualityCombo.set_sensitive(False) self._stopButton.set_sensitive(True) self._statusbar.set_text("Status: Recording") + elif activate == "encode": self._stopButton.set_sensitive(False) self._recordButton.set_sensitive(False) self._soundCheck.set_sensitive(False) self._qualityCombo.set_sensitive(False) self._statusbar.set_text("Status: Encoding") + else: self._stopButton.set_sensitive(False) self._recordButton.set_sensitive(True) -- cgit v0.9.1