tee branches with different sample rates

t.loeffler3 t.loeffler3 at gmail.com
Wed Jul 18 06:13:31 PDT 2012


Hi everyone, I'm writing a little gstreamer-based application in Python and 
I'm currently stuck at properly constructing my pipeline. I'm using playbin2 
with a custom audio-sink to be able to insert an equalizer into my pipeline. 
Now I'd like to do some analysis of the data that passes through my pipeline 
and for that I'm using a tee element in combination with an appsink. The
basic 
setup for this works fine. However, I'm having trouble negotiating the
format 
for my appsink. 

Basically I'd like the data that arrives at my autoaudiosink to be unchanged
(i.e. just forward the output of the equalizer element which gets its data
from
the playbin2) and perform resampling in my analysis branch to ensure a 
sampling rate of 8 kHz. I thought that since since the caps property was
only
set for an element in the analysis branch the branch with the autoaudiosink 
would be unaffected which turns out to be wrong. The format is correct in
the
analysis branch, i.e. the output of the new_buffer callback is 

audio/x-raw-float, endianness=(int)1234, channels=(int)2, width=(int)32,
depth=(int)32, signed=(boolean)true, rate=(int)8000

However, it's clearly audible that the sampling rate is in fact 8 kHz as
well
in the autoaudiosink branch. Here's the stripped down code I use to
construct
the pipeline. 

def __init_pipeline(self):
    bin = gst.Bin()

    equalizer = gst.element_factory_make("equalizer-10bands")

    tee = gst.element_factory_make("tee")
    queue_vis = gst.element_factory_make("queue")
    queue_vis.set_property("max_size_time", 1500 * gst.MSECOND)

    caps = gst.Caps(
        """
        audio/x-raw-float,
        endianness=(int)1234,
        channels=(int)2,
        width=(int)32,
        depth=(int)32,
        signed=(boolean)true,
        rate=(int)8000
        """
    )
    appsink = gst.element_factory_make("appsink")
    appsink.set_property("drop", True)
    appsink.set_property("sync", False)
    appsink.set_property("emit_signals", True)
    def pull(sink): print sink.emit("pull_buffer").get_caps()
    appsink.connect("new_buffer", pull)
    appsink.set_property("caps", caps)

    queue_player = gst.element_factory_make("queue")
    queue_player.set_property("max_size_time", 500 * gst.MSECOND)
    sink = gst.element_factory_make("autoaudiosink")

    elements = [equalizer, tee, queue_vis, appsink, queue_player, sink]
    map(bin.add, elements)

    pad = elements[0].get_static_pad("sink")
    bin.add_pad(gst.GhostPad("sink", pad))

    gst.element_link_many(self.__equalizer, tee)
    gst.element_link_many(tee, queue_player, sink)
    gst.element_link_many(tee, queue_vis, appsink)

    playbin = gst.element_factory_make("playbin2")
    playbin.set_property("audio_sink", bin)
    playbin.set_property("video_sink", None)
    
How can I ensure that the data is only converted in my analysis branch? I
tried
adding an audioconvert element before the appsink as well to no avail. It
seems
like specifying the caps property of the appsink causes an upstream
conversion
of the data if that makes sense.

I'd really appreciate the help. 
Kind regards, Klaus


--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/tee-branches-with-different-sample-rates-tp4655635.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list