import sys, inspect from pprint import pprint from gi.repository import GLib, Gst class Videomix: decoder = [] mixerpads = [] def __init__(self): self.pipeline = Gst.Pipeline() self.videomixer = Gst.ElementFactory.make('videomixer', 'videomixer') self.pipeline.add(self.videomixer) for uri in ("http://video.blendertestbuilds.de/download.blender.org/ED/ED_1280.avi", "http://download.blender.org/durian/trailer/sintel_trailer-720p.mp4",): decoder = Gst.ElementFactory.make('uridecodebin', 'uridecoder('+uri+')') decoder.set_property("uri", uri) decoder.connect("pad-added", self.OnDynamicPad) self.pipeline.add(decoder) self.decoder.append(decoder) self.monitorvideosink = Gst.ElementFactory.make('autovideosink', 'monitorvideosink') self.pipeline.add(self.monitorvideosink) self.videomixer.link(self.monitorvideosink) self.monitoraudiosink = Gst.ElementFactory.make('autoaudiosink', 'monitoraudiosink') self.pipeline.add(self.monitoraudiosink) self.pipeline.set_state(Gst.State.PLAYING) GLib.io_add_watch(sys.stdin, GLib.IO_IN, self.Input) def Input(self, fd, condition): if condition == GLib.IO_IN: char = fd.readline() try: i = int(char.rstrip()) print("settinh pad {0} to alpha=1".format(i)) self.mixerpads[i].set_property('alpha', 1) for idx, pad in enumerate(self.mixerpads): if idx != i: print("settinh pad {0} to alpha=0".format(idx)) pad.set_property('alpha', 0) except: pass return True else: return False def OnDynamicPad(self, uridecodebin, src_pad): caps = src_pad.query_caps(None).to_string() srcname = uridecodebin.get_name() print("{0}-source of {1} online".format(caps.split(',')[0], srcname)) if caps.startswith('audio/'): sinkpad = self.monitoraudiosink.get_static_pad("sink") # link the first audio-stream and be done if not sinkpad.is_linked(): src_pad.link(sinkpad) else: sinkpad = Gst.Element.get_request_pad(self.videomixer, "sink_%u") src_pad.link(sinkpad) self.mixerpads.append(sinkpad) print('add', sinkpad) sinkpad.set_property('alpha', 0.7)