diff options
author | Ariel Calzada <ariel@activitycentral.com> | 2012-10-31 12:08:14 (GMT) |
---|---|---|
committer | Ariel Calzada <ariel@activitycentral.com> | 2012-10-31 12:08:14 (GMT) |
commit | 2bcada3993dc9161abbf37734891fb6615218102 (patch) | |
tree | 39f279b3f8a3012bc918d819d9afcad1f321207e | |
parent | cb94ae7d86eb50d3a36769e4801b0319afdbfddd (diff) |
Modified pipeline for a better performance
-rw-r--r-- | DesktopGrab.py | 146 |
1 files changed, 83 insertions, 63 deletions
diff --git a/DesktopGrab.py b/DesktopGrab.py index 50ea096..da8bf79 100644 --- a/DesktopGrab.py +++ b/DesktopGrab.py @@ -1,6 +1,8 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- +# Copyright 2012 Flavio Danesse - flavio@activitycentral.com +# Copyright 2012 Ariel Calzada - ariel@activitycentral.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 2 of the License, or @@ -31,6 +33,23 @@ Model: queue max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! \ mux. mux. ! \ filesink location=file.ogg + +Modification 2012-10-31: + gst-launch-0.10 ximagesrc startx=0 endx=1200 starty=0 endy=900 ! \ + ffmpegcolorspace ! \ + videoscale ! \ + video/x-raw-yuv,width=640,height=480 ! \ + theoraenc ! \ + queue max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! \ + mux. oggmux name=mux \ + autoaudiosrc ! \ + audiorate silent=True tolerance=1000 ! \ + audio/x-raw-int,width=16,depth=16,rate=8000,channels=1 ! \ + audioconvert ! \ + vorbisenc ! \ + queue max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! \ + mux. mux. ! \ + filesink location=video.ogg ''' import sys @@ -47,35 +66,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 +102,7 @@ class DesktopGrab(gtk.Widget): self.video_filter = None self.theoraenc = None self.queue_video = None - + # Sound self.gconfaudiosrc = None self.audiorate = None @@ -94,21 +113,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) @@ -125,14 +144,16 @@ class DesktopGrab(gtk.Widget): self.queue_video.set_property('max-size-buffers', 8000) self.queue_video.set_property('max-size-bytes', 0) self.queue_video.set_property('max-size-time', 0) - + # Sound - self.gconfaudiosrc = gst.element_factory_make('gconfaudiosrc', "gconfaudiosrc") - self.gconfaudiosrc.set_property("async-handling", True) + #self.gconfaudiosrc = gst.element_factory_make('gconfaudiosrc', "gconfaudiosrc") + self.gconfaudiosrc = gst.element_factory_make('autoaudiosrc', "gconfaudiosrc") + #self.gconfaudiosrc.set_property("async-handling", True) self.audiorate = gst.element_factory_make("audiorate", "audiorate") self.audiorate.set_property('silent', True) self.audiorate.set_property('tolerance', 1000) - audio_rate = gst.Caps("audio/x-raw-int,endianness=1234,rate=8000,channels=1,width=16,depth=16,signed=False") + #audio_rate = gst.Caps("audio/x-raw-int,endianness=1234,rate=8000,channels=1,width=16,depth=16,signed=False") + audio_rate = gst.Caps("audio/x-raw-int,rate=8000,channels=1,width=16,depth=16") self.sound_filter = gst.element_factory_make("capsfilter", "sound_filter") self.sound_filter.set_property("caps", audio_rate) self.audioconvert = gst.element_factory_make('audioconvert', "audioconvert") @@ -141,28 +162,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, @@ -172,10 +193,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, @@ -184,7 +205,7 @@ class DesktopGrab(gtk.Widget): self.theoraenc, self.queue_video, self.oggmux) - + gst.element_link_many( self.gconfaudiosrc, self.audiorate, @@ -193,14 +214,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, @@ -216,10 +237,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, @@ -229,88 +250,88 @@ 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() 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) - + 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__": - + grabador = DesktopGrab() grabador.set_audio_enabled(True) dat = datetime.date.today() @@ -321,4 +342,3 @@ if __name__=="__main__": path = os.path.join('/home/olpc',"%s-%s.ogg" % (dat, tim)) grabador.record(path) gtk.main() - |