Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAriel Calzada <ariel@activitycentral.com>2012-10-31 12:08:14 (GMT)
committer Ariel Calzada <ariel@activitycentral.com>2012-10-31 12:08:14 (GMT)
commit2bcada3993dc9161abbf37734891fb6615218102 (patch)
tree39f279b3f8a3012bc918d819d9afcad1f321207e
parentcb94ae7d86eb50d3a36769e4801b0319afdbfddd (diff)
Modified pipeline for a better performance
-rw-r--r--DesktopGrab.py146
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()
-