Gnolin and Python - Theora/Vorbis ogg video only creating one pad
Matt Veenstra
matt at tribalmedia.com
Fri Feb 11 19:49:59 CET 2011
I worked my way through this and now have the basics working. Here
are the 2 tricks and then plenty of details to get this working.
1. You must use 2 gnlfilesource with the same file and set the caps.
This makes sense. I just missed this in the docs.
2. I was not able to get this to work if I put gnlfilesource in
gnlcomposition. In this case I always failed in the linking of
elements and was not able to work around this. I am not sure now when
to use gnlcomposition vs not.
Thanks,
Matt
On Fri, Feb 11, 2011 at 9:42 AM, Matt Veenstra <matt at tribalmedia.com> wrote:
> Hi,
>
> I use a gnlfilesource with an .ogv source file (theora/vorbis). I
> only get one pad created when we start playing (the video pad), I
> never receive the audio pad added callback of the composition.
>
> I tried to add a "decodebin" and connect this to the composition or
> gnlfilesource without any luck.
>
> What am I missing to get both pads created? A plain vorbis audio file
> works fine. I receive no errors in the code.
>
> Here is the code.
>
> class Main:
> def __init__(self):
> self.mainloop = gobject.MainLoop()
>
> # creating the pipeline
> self.pipeline = gst.Pipeline("mypipeline")
>
> # Create bus and connect several handlers
> self.bus = self.pipeline.get_bus()
> self.bus.add_signal_watch()
> self.bus.connect('message::eos', self.OnEOS)
> self.bus.connect('message::tag', self.OnTag)
> self.bus.connect('message::error', self.OnError)
>
> # creating a gnlcomposition
> self.comp = gst.element_factory_make("gnlcomposition", "composition")
> self.pipeline.add(self.comp)
> self.comp.connect("pad-added", self.OnPad)
>
> # create an audioconvert
> self.audioconvert = gst.element_factory_make("audioconvert", "audioconvert")
> self.pipeline.add(self.audioconvert)
>
> # create an audioconvert
> self.videoconvert = gst.element_factory_make("ffmpegcolorspace")
> self.pipeline.add(self.videoconvert)
>
> # create an fakesink
> self.sink = gst.element_factory_make("fakesink", "fakesink")
> self.pipeline.add(self.sink)
>
> # create a gnlfilesource
> self.stream1 = gst.element_factory_make("gnlfilesource", "stream1")
> self.comp.add(self.stream1)
>
> # set the gnlfilesource properties
> self.stream1.set_property("location", "/transcoder/samples/video.ogv")
> # self.stream1.set_property("location",
> "/transcoder/samples/Epoq-Lepidoptera.ogg")
> self.stream1.set_property("start", 0 * gst..SECOND)
> self.stream1.set_property("duration", 5 * gst.SECOND)
> self.stream1.set_property("media-start", 10 * gst.SECOND)
> self.stream1.set_property("media-duration", 5 * gst.SECOND)
>
> self.pipeline.set_state(gst.STATE_PLAYING)
> self.mainloop.run()
>
>
> def OnPad(self, comp, pad):
> aCaps = pad.get_caps()
> aName = aCaps[0].get_name()
> print "pad added!", aName
>
> if aName == 'audio/x-raw-float' or aName == 'audio/x-raw-int':
> convpad = self.audioconvert.get_compatible_pad(pad, pad.get_caps())
> if not convpad.is_linked(): # Only link once
> print "linking audio pads"
> pad.link(convpad)
> self.audioconvert.link(self.mux)
> elif aName == 'video/x-raw-yuv':
> convpad = self.videoconvert.get_compatible_pad(pad, pad.get_caps())
> if not convpad.is_linked(): # Only link once
> print "linking video pads"
> pad.link(convpad)
> self.videoconvert.link(self.sink)
>
>
> I am not sure this is the correct forum so please let me know if I
> should post elsewhere.
>
> Thanks,
> Matt
>
_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
More information about the gstreamer-devel
mailing list