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