gstreamer appsrc funciona para xvimagesink pero no en theoraenc! oggmux

Estoy tratando de transmitir un video generado por computadora usando gstreamer y icecast, pero no puedo hacer que gstreamer appsrc funcione. Mi aplicación funciona como se esperaba si uso xvimagesink como sumidero (vea el código comentado más adelante). Pero una vez que lo canalizo a theoraenc no se ejecuta.

Intercambié shoutysend con el archivo para verificar si el problema era icecast, el resultado es que no se escriben datos en el archivo. Sustituir appsrc con testvideosrc funciona como se esperaba. ¿Cualquier sugerencia?

#!/usr/bin/env python import sys, os, pygtk, gtk, gobject import pygst pygst.require("0.10") import gst import numpy as np class GTK_Main: def __init__(self): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.connect("destroy", gtk.main_quit, "WM destroy") vbox = gtk.VBox() window.add(vbox) self.button = gtk.Button("Start") self.button.connect("clicked", self.start_stop) vbox.add(self.button) window.show_all() self.player = gst.Pipeline("player") source = gst.element_factory_make("appsrc", "source") caps = gst.Caps("video/x-raw-gray,bpp=16,endianness=1234,width=320,height=240,framerate=(fraction)10/1") source.set_property('caps',caps) source.set_property('blocksize',320*240*2) source.connect('need-data', self.needdata) colorspace = gst.element_factory_make('ffmpegcolorspace') enc = gst.element_factory_make('theoraenc') mux = gst.element_factory_make('oggmux') shout = gst.element_factory_make('shout2send') shout.set_property("ip","localhost") shout.set_property("password","hackme") shout.set_property("mount","/stream") caps = gst.Caps("video/x-raw-yuv,width=320,height=240,framerate=(fraction)10/1,format=(fourcc)I420") enc.caps = caps videosink = gst.element_factory_make('xvimagesink') videosink.caps = caps self.player.add(source, colorspace, enc, mux, shout) gst.element_link_many(source, colorspace, enc, mux, shout) #self.player.add(source, colorspace, videosink) #gst.element_link_many(source, colorspace, videosink) def start_stop(self, w): if self.button.get_label() == "Start": self.button.set_label("Stop") self.player.set_state(gst.STATE_PLAYING) else: self.player.set_state(gst.STATE_NULL) self.button.set_label("Start") def needdata(self, src, length): bytes = np.int16(np.random.rand(length/2)*30000).data src.emit('push-buffer', gst.Buffer(bytes)) GTK_Main() gtk.gdk.threads_init() gtk.main() 

Creo que es más probable que su problema tenga que ver con la marca de tiempo de los buffers. He hecho algunas pruebas rápidas, usando ese código y reemplazando el elemento de grito con oggdemux, theoradec, ffmpegcolorspace y ximagesink. Al principio, no obtuve ninguna salida, pero después de prescindir del muxing / demuxing por completo, obtuve una imagen estática, junto con algunos mensajes de depuración sobre las marcas de tiempo. Obtuve la salida correcta después de configurar las propiedades is-live y do-timestamp en true en appsrc.

Supongo que debería ser posible establecer directamente las marcas de tiempo en los buffers que está eliminando de appsrc, pero lamentablemente no he descubierto cómo hacerlo.