Hi,
can anyone provide working example for querying duration of an audio
file
using Ruby/GStreamer?
Code in gstreamer/src/samples/ is completely outdated and IMHO should be
removed from the repository.
I attach my current code below, but I always got an error like
“Gst::QueryType::Type isn’t supported”, doesn’t matter what kind of
query I
pass to pad.query. Even if I pass attributes taken from pad.query_types!
It
seems that’s a bug?
–
m.
CODE:
#!/usr/bin/ruby
require ‘gst’
Gst.init
class DurationMeter
def initialize
@pipeline = Gst::Pipeline.new(“durationmeter”)
@source = Gst::ElementFactory.make("filesrc")
@source.location = ARGV[0]
@convertor = Gst::ElementFactory.make("audioconvert")
@sink = Gst::ElementFactory.make("fakesink")
@decoder = Gst::ElementFactory.make("decodebin")
@decoder.signal_connect("new-decoded-pad") do | dbin, pad, is_last |
pad.link @convertor.get_pad("sink")
@convertor >> @sink
@sinkpad = @sink.get_pad("sink")
@sinkpad.signal_connect("notify::caps") do |pad, args|
if pad.negotiated_caps
puts pad.query Gst::QueryType::DURATION
end
end
end
@pipeline.add @source, @decoder, @convertor, @sink
@source >> @decoder
@pipeline.bus.add_watch do | bus, message |
case message.type
when Gst::Message::Type::ERROR
puts "Error"
puts message.structure["debug"]
@pipeline.stop
exit 1
when Gst::Message::Type::EOS
puts "EOS"
@pipeline.stop
exit 0
when Gst::Message::Type::ELEMENT
puts "Message from #{message.source.name}"
end
true
end
end
def play
@pipeline.play
end
def stop
@pipeline.stop
end
end
meter = DurationMeter.new
meter.play
mainloop = GLib::MainLoop.new GLib::MainContext.default, true
mainloop.run