[gst-devel] Using gnonlin to extract time segments from a video file

Rodrigo Manhães rmanhaes at gmail.com
Tue Feb 17 20:24:34 CET 2009


Hi,

thanks for your help and patience.

I have more two doubts:

1) start, duration, media-start and media-duration

I've tried to do what you said, but didn't work. This first attempt
was intended to extract only a video slice from the original file. The
values assigned to the properties are ignored and the whole video is
generated. The code is below:

import gst
import gtk

pipeline = gst.Pipeline()

composition = gst.element_factory_make('gnlcomposition')
pipeline.add(composition)

source = gst.element_factory_make('gnlfilesource')
source.set_property('location', 'he-man.mpg')
source.set_property('start', 0)
source.set_property('duration', 10 * gst.SECOND)
source.set_property('media-start', 30 * gst.SECOND)
source.set_property('media-duration', 10 * gst.SECOND)
composition.add(source)

video_encoder = gst.element_factory_make('theoraenc')
pipeline.add(video_encoder)

muxer = gst.element_factory_make('oggmux')
pipeline.add(muxer)
video_encoder.get_pad('src').link(muxer.get_pad('sink_%d'))

sink = gst.element_factory_make('filesink')
sink.set_property('location', 'output.ogg')
pipeline.add(sink)
muxer.link(sink)

def on_new_pad(bin, pad):
    print pad.get_caps()[0].get_name()
    pad.link(video_encoder.get_pad('sink'))

def on_message(bus, message):
    if message.type == gst.MESSAGE_EOS:
        pipeline.set_state(gst.STATE_NULL)
        gtk.main_quit()

composition.connect('pad-added', on_new_pad)

bus = pipeline.get_bus()
bus.add_signal_watch()
bus.connect('message', on_message)

pipeline.set_state(gst.STATE_PLAYING)
gtk.main()


2) Doubts on getting the audio pad in a gnonlin video pipeline

>  GNonLin elements are one-output-stream-only elements. If you wish to
> do processing on audio AND video, you will have to create:
>  * 2 compositions (one per media type)
>  * 2 sources (one per media type), you will have to set the 'caps'
> properties of each of the sources to the correct type (Ex:
> gst.Caps("video/x-raw-yuv;video/x-raw-rgb") for the video one).
>
>  Then put one source in each composition and connect each of those
> composition to the adequate downstream elements (sinks, encoders,
> etc...).

I understood your explanation, but I don't know how to program it. The
example you gave creates a gst.Caps object, but how do I set the caps
to the source or composition? I tried to do

source.set_property('caps', gst.Caps("audio/x-raw-int"))

but it also doesn't work, getting the following error

gst.LinkError: <enum GST_PAD_LINK_NOFORMAT of type GstPadLinkReturn>

when connecting the obtained pad to the audio encoder.

[]'s
Rodrigo


2009/2/16 Edward Hervey <bilboed at gmail.com>:
> Hi,
>
>  GNonLin elements are one-output-stream-only elements. If you wish to
> do processing on audio AND video, you will have to create:
>  * 2 compositions (one per media type)
>  * 2 sources (one per media type), you will have to set the 'caps'
> properties of each of the sources to the correct type (Ex:
> gst.Caps("video/x-raw-yuv;video/x-raw-rgb") for the video one).
>
>  Then put one source in each composition and connect each of those
> composition to the adequate downstream elements (sinks, encoders,
> etc...).
>
>  Why only one stream ? Because it is the lowest common denominator for
> all types of non-linear operations. Various tests have proven the
> overhead of duplicating the sources is minimal provided you code them
> properly (the only duplicated processing part will be the filesource and
> demuxer).
>
>  Hope this helps,
>
>    Edward
>
> On Fri, 2009-02-13 at 15:53 -0200, Rodrigo Manhães wrote:
>> Hi,
>>
>> I wrote two small scripts to explain my problem on getting dynamic
>> pads with gnonlin.
>>
>> The first, with no gnonlin, uses a filesrc, and prints:
>>
>> video/x-raw-yuv
>> audio/x-raw-int
>>
>> indicating that it found the two pads.
>> The code is below.
>>
>> ###
>> import gst
>> import gtk
>>
>> pipeline = gst.Pipeline()
>>
>> source = gst.element_factory_make('filesrc')
>> source.set_property('location', 'creature.mpg')
>> pipeline.add(source)
>>
>> decoder = gst.element_factory_make('decodebin')
>> pipeline.add(decoder)
>> source.link(decoder)
>>
>> def on_new_pad(bin, pad):
>>     print pad.get_caps()[0].get_name()
>>
>> decoder.connect('pad-added', on_new_pad)
>>
>> pipeline.set_state(gst.STATE_PLAYING)
>> gtk.main()
>>
>> ####
>>
>> The second, using gnonlin, prints:
>>
>> video/x-raw-yuv
>>
>> indicating that only the video stream was found. (If I connect the
>> signal to gnlfilesource rather than gnlcomposition, the result is the
>> same)
>> The code is below:
>>
>> ###
>> import gst
>> import gtk
>>
>> pipeline = gst.Pipeline()
>>
>> composition = gst.element_factory_make('gnlcomposition')
>> pipeline.add(composition)
>>
>> source = gst.element_factory_make('gnlfilesource')
>> source.set_property('location', 'creature.mpg')
>> source.set_property('start', 0)
>> source.set_property('media-start', 0)
>> source.set_property('duration', 10)
>> source.set_property('media-duration', 10)
>> composition.add(source)
>>
>> def on_new_pad(bin, pad):
>>     print pad.get_caps()[0].get_name()
>>
>> source.connect('pad-added', on_new_pad)
>>
>> pipeline.set_state(gst.STATE_PLAYING)
>> gtk.main()
>> #####
>>
>> What am I doing wrong?
>>
>> []'s
>> Rodrigo
>>
>> 2009/2/12 Rodrigo Manhães <rmanhaes at gmail.com>:
>> > 2009/2/12 Edward Hervey <bilboed at gmail.com>:
>> >>  'new-decoded-pad' is a convenience signal for new pads on decodebin.
>> >> The normal signal for new pads being added to an element is 'pad-added'.
>> >
>> > Using 'pad-added' signal, the callback is called only once, for the
>> > video stream. The pad for audio part is not added.
>> >
>> > []'s
>> > Rodrigo
>> >
>>
>> ------------------------------------------------------------------------------
>> Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
>> -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
>> -Strategies to boost innovation and cut costs with open source participation
>> -Receive a $600 discount off the registration fee with the source code: SFAD
>> http://p.sf.net/sfu/XcvMzF8H
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>
>
> ------------------------------------------------------------------------------
> Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
> -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
> -Strategies to boost innovation and cut costs with open source participation
> -Receive a $600 discount off the registration fee with the source code: SFAD
> http://p.sf.net/sfu/XcvMzF8H
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>




More information about the gstreamer-devel mailing list