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