grabaciones truncadas con Python GStreamer

Pablo Rodríguez oinos en web.de
Dom Oct 26 10:37:19 CET 2008


Hola a todos,

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).

Creo que la documentación de GStreamer se refiere a esto en "Controlled 
shutdown of live sources in applications" 
(http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html) 
  y propone la solución siguiente:

"Since GStreamer 0.10.16 an application may send an EOS event to a 
source element to make it perform the EOS logic (send EOS event 
downstream or post a GST_MESSAGE_SEGMENT_DONE on the bus). This can 
typically be done with the gst_element_send_event() function on the 
element or its parent bin."

Si no entiendo mal, tengo que cambiar la última línea del código 
(self.player.set_state(gst.STATE_NULL)) por algo que use 
gst_element_send_event(), pero no sé ni por donde empezar,

He estado leyendo la documentación de GStreamer y no la entiendo, porque 
está explicada para C (o C++) y sólo entiendo un poco de Python. Os 
puedo asegurar que le he dedicado tiempo de búsqueda, pero me pierdo, es 
demasiado complicado para lo que entiendo.

¿Alguien sería tan amable de decirme el código (que supongo que será una 
línea), para mandar el evento de fin de flujo de grabación (esto es, 
para usar el gst_element_send_event() y EOS)?

Gracias y saludos,


Pablo


def __init__(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", self.filename + "-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()

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 self.playing == False:
             self.playing = True
             self.player.set_state(gst.STATE_PLAYING)
         elif self.playing == True:
             self.player.set_state(gst.STATE_NULL)
_______________________________________________
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