How can I create a mosaic in Gstreamer? How can I set "sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=0" in Python?
Thiago Santos
thiagoss at osg.samsung.com
Wed Aug 5 13:43:43 PDT 2015
On 08/05/2015 01:26 PM, Giacomo D wrote:
> Perfect Thiago, your help has been great!!
>
> But now everything works fine or it seems so because I haven't got errors
> but unfortunately nothing shows.
>
>
> As I said, I want to write in Python this command line which works well:
>
>
> gst-launch-1.0 -e \
> videomixer name=mix \
> sink_0::xpos=0 sink_0::ypos=0 sink_0::alpha=0\
> sink_1::xpos=0 sink_1::ypos=0 \
> sink_2::xpos=200 sink_2::ypos=0 \
> sink_3::xpos=0 sink_3::ypos=100 \
> sink_4::xpos=200 sink_4::ypos=100 \
> ! xvimagesink \
> videotestsrc pattern="black" \
> ! video/x-raw,width=400,height=200 \
> ! mix.sink_0 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
> ! decodebin ! videoconvert ! videoscale \
> ! video/x-raw,width=200,height=100 \
> ! mix.sink_1 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
> ! decodebin ! videoconvert ! videoscale \
> ! video/x-raw,width=200,height=100 \
> ! mix.sink_2 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
> ! decodebin ! videoconvert ! videoscale \
> ! video/x-raw,width=200,height=100 \
> ! mix.sink_3 \
> filesrc location=/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi
> \
> ! decodebin ! videoconvert ! videoscale \
> ! video/x-raw,width=200,height=100 \
> ! mix.sink_4 \
>
>
> and the result is this:
>
> <http://gstreamer-devel.966125.n4.nabble.com/file/n4672994/42.png>
>
> So I have written it in Python like below but nothing is showing up as a
> result:
>
>
>
> _author__ = 'giacomo'
>
> import sys
> from gi.repository import Gst
> from gi.repository import GObject
> GObject.threads_init()
> Gst.init(None)
>
> import os
>
> class VideoBox():
> def __init__(self):
> mainloop = GObject.MainLoop()
> # Create transcoding pipeline
> self.pipeline = Gst.Pipeline()
>
> self.videotestsrc = Gst.ElementFactory.make('videotestsrc', None)
> self.videotestsrc.set_property("pattern", "black")
> self.pipeline.add(self.videotestsrc)
>
> self.filesrc1 = Gst.ElementFactory.make('filesrc', None)
> self.filesrc1.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
> self.pipeline.add(self.filesrc1)
>
>
> self.filesrc2 = Gst.ElementFactory.make('filesrc', None)
> self.filesrc2.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
> self.pipeline.add(self.filesrc2)
>
> self.filesrc3 = Gst.ElementFactory.make('filesrc', None)
> self.filesrc3.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
> self.pipeline.add(self.filesrc3)
>
> self.filesrc4 = Gst.ElementFactory.make('filesrc', None)
> self.filesrc4.set_property("location",
> "/home/giacomo/Scrivania/Sam_Smith_-_Im_Not_The_Only_One.avi")
> self.pipeline.add(self.filesrc4)
>
> self.videomixer = Gst.ElementFactory.make('videomixer', None)
> self.pipeline.add(self.videomixer)
>
>
>
> self.pad0 = self.videomixer.get_request_pad("sink_%u")
> self.pad1 = self.videomixer.get_request_pad("sink_%u")
> self.pad2 = self.videomixer.get_request_pad("sink_%u")
> self.pad3 = self.videomixer.get_request_pad("sink_%u")
> self.pad4 = self.videomixer.get_request_pad("sink_%u")
>
>
>
> #sink_0
> self.pad0.set_property('xpos',0)
> self.pad0.set_property("ypos",0)
> self.pad0.set_property("alpha",0)
>
> #sink_1
> self.pad1.set_property("xpos",0)
> self.pad1.set_property("ypos",0)
>
> #sink_2
> self.pad2.set_property("xpos",200)
> self.pad2.set_property("ypos",0)
>
> #sink_3
> self.pad3.set_property("xpos",0)
> self.pad3.set_property("ypos",100)
>
> #sink_4
> self.pad4.set_property("xpos",200)
> self.pad4.set_property("ypos",100)
>
>
>
> self.decodebin1 = Gst.ElementFactory.make('decodebin', None)
> self.pipeline.add(self.decodebin1)
>
> self.decodebin2 = Gst.ElementFactory.make('decodebin', None)
> self.pipeline.add(self.decodebin2)
>
> self.decodebin3 = Gst.ElementFactory.make('decodebin', None)
> self.pipeline.add(self.decodebin3)
>
> self.decodebin4 = Gst.ElementFactory.make('decodebin', None)
> self.pipeline.add(self.decodebin4)
>
>
> self.videoformatconverter1 = Gst.ElementFactory.make('videoconvert',
> None)
> self.pipeline.add(self.videoformatconverter1)
>
> self.videoformatconverter2 = Gst.ElementFactory.make('videoconvert',
> None)
> self.pipeline.add(self.videoformatconverter2)
>
> self.videoformatconverter3 = Gst.ElementFactory.make('videoconvert',
> None)
> self.pipeline.add(self.videoformatconverter3)
>
> self.videoformatconverter4 = Gst.ElementFactory.make('videoconvert',
> None)
> self.pipeline.add(self.videoformatconverter4)
>
> self.videoscale1 = Gst.ElementFactory.make('videoscale', None)
> self.pipeline.add(self.videoscale1)
>
> self.videoscale2 = Gst.ElementFactory.make('videoscale', None)
> self.pipeline.add(self.videoscale2)
>
> self.videoscale3 = Gst.ElementFactory.make('videoscale', None)
> self.pipeline.add(self.videoscale3)
>
> self.videoscale4 = Gst.ElementFactory.make('videoscale', None)
> self.pipeline.add(self.videoscale4)
>
>
> camera0caps =
> Gst.Caps.from_string("video/x-raw,width=400,height=200")
>
> self.camerafilter0 = Gst.ElementFactory.make("capsfilter", "filter0")
> self.camerafilter0.set_property("caps", camera0caps)
> self.pipeline.add(self.camerafilter0)
>
>
> camera1caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
>
> self.camerafilter1 = Gst.ElementFactory.make("capsfilter", "filter1")
> self.camerafilter1.set_property("caps", camera1caps)
> self.pipeline.add(self.camerafilter1)
> #
> camera2caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
> self.camerafilter2 = Gst.ElementFactory.make("capsfilter", "filter2")
> self.camerafilter2.set_property("caps", camera2caps)
> self.pipeline.add(self.camerafilter2)
>
> camera3caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
>
> self.camerafilter3 = Gst.ElementFactory.make("capsfilter", "filter3")
> self.camerafilter3.set_property("caps", camera3caps)
> self.pipeline.add(self.camerafilter3)
>
>
> camera4caps =
> Gst.Caps.from_string("video/x-raw,width=200,height=100")
>
> self.camerafilter4 = Gst.ElementFactory.make("capsfilter", "filter4")
> self.camerafilter4.set_property("caps", camera4caps)
> self.pipeline.add(self.camerafilter4)
>
> self.xvimagesink = Gst.ElementFactory.make('xvimagesink',None)
> self.pipeline.add(self.xvimagesink)
>
>
>
> self.videotestsrc.link(self.camerafilter0)
>
> self.camerafilter0.get_static_pad("src").link(self.videomixer.get_static_pad("sink_0"))
>
>
>
> self.filesrc1.link(self.decodebin1)
> self.decodebin1.link(self.videoformatconverter1)
> self.videoformatconverter1.link(self.videoscale1)
> self.videoscale1.link(self.camerafilter1)
>
> self.camerafilter1.get_static_pad("src").link(self.videomixer.get_static_pad("sink_1"))
>
>
> self.filesrc2.link(self.decodebin2)
> self.decodebin2.link(self.videoformatconverter2)
> self.videoformatconverter2.link(self.videoscale2)
> self.videoscale2.link(self.camerafilter2)
>
> self.camerafilter2.get_static_pad("src").link(self.videomixer.get_static_pad("sink_2"))
>
>
> self.filesrc3.link(self.decodebin3)
> self.decodebin3.link(self.videoformatconverter3)
> self.videoformatconverter3.link(self.videoscale3)
> self.videoscale3.link(self.camerafilter3)
>
> self.camerafilter3.get_static_pad("src").link(self.videomixer.get_static_pad("sink_3"))
>
> self.filesrc4.link(self.decodebin4)
> self.decodebin4.link(self.videoformatconverter4)
> self.videoformatconverter4.link(self.videoscale4)
> self.videoscale4.link(self.camerafilter4)
>
> self.camerafilter4.get_static_pad("src").link(self.videomixer.get_static_pad("sink_4"))
>
>
> self.videomixer.link(self.xvimagesink)
> self.pipeline.set_state(Gst.State.PLAYING)
> mainloop.run()
>
> if __name__ == "__main__":
> app = VideoBox()
> signal.signal(signal.SIGINT, signal.SIG_DFL)
> exit_status = app.run(sys.argv)
> sys.exit(exit_status)
>
>
>
>
> Can you or someone else help me??
decodebin has sometimes source pads, meaning that they won't exist until
the stream has started and decodebin has decided to add them. Because of
that you can't just link with decodebin.link(someelement) as there is no
pad to link and it will return an error (it is recommended to check the
return of those functions).
Check the documentation for the dynamic pads, you need to register a
callback on the pad-added signal and link from there. There should be
plenty of examples available on the internet for this. The documentation
should also include one (in C), but that is translatable to the the
python bindings.
Regards,
>
> thanks
> Giacomo
>
>
>
>
> --
> View this message in context: http://gstreamer-devel.966125.n4.nabble.com/How-can-I-create-a-mosaic-in-Gstreamer-How-can-I-set-sink-0-xpos-0-sink-0-ypos-0-sink-0-alpha-0-in-P-tp4672943p4672994.html
> Sent from the GStreamer-devel mailing list archive at Nabble.com.
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
--
Thiago Sousa Santos
Senior Multimedia Engineer, Open Source Group
Samsung Research America - Silicon Valley
More information about the gstreamer-devel
mailing list