rendered paste bodyimport 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