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