Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorflavio <fdanesse@gmail.com>2012-10-02 22:20:31 (GMT)
committer flavio <fdanesse@gmail.com>2012-10-02 22:20:31 (GMT)
commitfd24c51bf5a6befa85b80ffa61c2cb6b65f649af (patch)
treedc84e75b251edbd6eece08f580ecc86eb8197503
parent09fd878f7712eb6163e7e75a9aadc14aaa76695f (diff)
Funcionando en xo 1.75 sugar 0.96.2 falta que guarde en el journal
-rw-r--r--.gitignore1
-rw-r--r--DesktopGrab.py131
-rw-r--r--screencast_activity.py44
-rw-r--r--screencast_ui.py2
4 files changed, 85 insertions, 93 deletions
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)