All pastes #1550087 Raw Edit

Miscellany

public text v1 · immutable
#1550087 ·published 2009-09-01 08:48 UTC
rendered paste body
import gobject
gobject.threads_init()
import gst
import sys

def _decodePadAdded(bin, pad, target):
    tpad = target.get_compatible_pad(pad)
    if tpad:
        pad.link(tpad)
    else:
        fakesink = gst.element_factory_make('fakesink')
        pipeline.add(fakesink)
        tpad = fakesink.get_compatible_pad(pad)
        pad.link(tpad)
    return True

def _watchFunc(bus, message):
    if message.type == gst.MESSAGE_ELEMENT:
        structure = message.structure
        if structure.get_name() == 'level':
            samples.append(structure['peak'][0])
    elif message.type == gst.MESSAGE_SEGMENT_DONE:
        ml.quit()
    elif message.type == gst.MESSAGE_ERROR:
        print "bus error: %r" % message.parse_error()
        ml.quit()
    elif message.type == gst.MESSAGE_EOS:
        ml.quit()
    return gst.BUS_PASS

def _fetchSamples(interval):
    level.props.interval = interval
    pipeline.seek(1.0, 
        gst.FORMAT_TIME,
        gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE |
            gst.SEEK_FLAG_SEGMENT,
        gst.SEEK_TYPE_SET, 0L,
        gst.SEEK_TYPE_SET, 10 * gst.SECOND)
    pipeline.set_state(gst.STATE_PLAYING)

pipeline = gst.Pipeline()
source = gst.element_factory_make('filesrc')
source.props.location = sys.argv[1]
decode = gst.element_factory_make('decodebin')
sink = gst.element_factory_make('fakesink')
convert = gst.element_factory_make('audioconvert')
level = gst.element_factory_make('level')
level.props.message = True

pipeline.add(source, decode, convert, level, sink)

source.link(decode)
decode.connect('pad-added', _decodePadAdded, convert)
convert.link(level)
level.link(sink)
sink.props.sync = False

level = level

pipeline.set_state(gst.STATE_PAUSED)
bus = pipeline.get_bus()
bus.add_signal_watch()
bus.connect("message", _watchFunc)

ml = gobject.MainLoop()

i = 1
interval = 0 
while i <= 140:
    interval = gst.SECOND / (140 - i)
    samples = []
    _fetchSamples(interval)
    ml.run()
    display_interval = float(interval) / gst.SECOND
    expected = int(10 / display_interval)
    print display_interval, len(samples), expected
    i += 10