grabaciones truncadas con Python GStreamer
Pablo Rodríguez
oinos en web.de
Dom Oct 26 19:16:52 CET 2008
Gracias Arnau, por la respuesta.
Arnau Sanchez wrote:
> Hola Pablo,
>
> Pablo Rodríguez escribió:
>
>> con el código que incluyo abajo, grabo sonido a un archivo WAV. El
>> único problema es que el archivo de sonido se trunca antes de termine
>> la grabación (y es erróneo).
>
> ¿Puedes mandar el resto del código? Es mejor mostrar algo que funcione
> directamente, así podemos probarlo sin tener que completarlo cada uno
> por nuestra cuenta. Si es muy largo puedes colgarlo en algún sitio y lo
> descargamos.
Por supuesto, lo incluyo al final. No me dí cuenta de eso. Perdón.
Lo que pasa es que el archivo termina abruptamente, como confirman estos
dos programas:
$ sox record-audio.wav re.wav
sox wav: Premature EOF on .wav input file
$ soxi record-audio.wav
Input File : 'record-audio.wav'
Channels : 2
Sample Rate : 44100
Precision : 32-bit
Duration : 101:26.79 = 268427264 samples = 456509 CDDA sectors
Sample Encoding: 32-bit Signed Integer PCM
La duración no es 141 minutos, sino que no llegará a diez segundos, por
eso hay ahí algo muy extraño.
>> def on_key_press_event(self, widget, event):
>> if (event.keyval == gtk.keysyms.space):
>> if self.playing == False:
>> self.playing = True
>> self.player.set_state(gst.STATE_PLAYING)
>> elif self.playing == True:
>> self.player.set_state(gst.STATE_NULL)
>
> En Python no es idiomático comparar directamente con booleanos:
>
> if algo == True: -> if algo:
> if algo == False: => if not algo:
Gracias, no lo sabía.
> ¿En el "elif" no le falta poner un "self.playing = False"? Si es así,
> el código se puede simplificar bastante (python 2.5):
>
> if event.keyval == gtk.keysyms.space:
> self.player.set_state(gst.STATE_NULL if self.playing else
> gst.STATE_PLAYING)
> self.playing = not self.playing
En realidad el programa está simplificado, pero está bien saberlo.
Aquí está el código:
import gtk
import pygtk
import gtk.glade
import sys
import pygst
pygst.require("0.10")
import gst
class rec_audio:
def __init__(self):
self.gui = gtk.glade.XML("recording-audio.glade","mainwindow",
domain="recslides")
self.win = self.gui.get_widget("mainwindow")
self.gui.signal_autoconnect(self)
self.player = gst.Pipeline("player")
self.clock = self.player.get_clock()
self.source = gst.element_factory_make("alsasrc", "alsa-source")
self.encoder = gst.element_factory_make("wavenc", "wavenc")
self.fileout = gst.element_factory_make("filesink", "sink")
self.fileout.set_property("location", "record-audio.wav")
self.player.add(self.source, self.encoder, self.fileout)
gst.element_link_many(self.source, self.encoder, self.fileout)
bus = self.player.get_bus()
bus.add_signal_watch()
bus.enable_sync_message_emission()
bus.connect('message', self.on_message)
self.playing = False
self.recording_time = self.player.get_last_stream_time()
#~ self.file_times.write("supershow" + "\n")
self.win.show_all()
def on_message(self, bus, message):
t = message.type
if t == gst.MESSAGE_EOS:
self.player.set_state(gst.STATE_NULL)
elif t == gst.MESSAGE_ERROR:
err, debug = message.parse_error()
print "Error: %s" % err, debug
self.player.set_state(gst.STATE_NULL)
def on_key_press_event(self, widget, event):
if (event.keyval == gtk.keysyms.space):
if not self.playing:
self.playing = True
self.player.set_state(gst.STATE_PLAYING)
print "Empiezo a grabar sonido"
elif self.playing:
self.player.set_state(gst.STATE_NULL)
print "Termino de grabar sonido"
gtk.main_quit()
def gtk_main_quit(self, widget, event):
gtk.main_quit()
def main(self):
gtk.main()
rec = rec_audio()
rec.main()
Y el correspondiente archivo de Glade:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.3 on Sun Oct 26 19:10:48 2008 -->
<glade-interface>
<widget class="GtkWindow" id="mainwindow">
<property name="title" translatable="yes">recSlides</property>
<property name="default_width">400</property>
<property name="default_height">300</property>
<signal name="key_press_event" handler="on_key_press_event"/>
<signal name="delete_event" handler="gtk_main_quit"/>
<child>
<placeholder/>
</child>
</widget>
</glade-interface>
Gracias de nuevo y saludos,
Pablo
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es