aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xexample-scripts/gstreamer/source-background-loop.py118
-rwxr-xr-xexample-scripts/gstreamer/source-nostream-music-from-folder.py363
-rwxr-xr-xexample-scripts/gstreamer/source-remote-desktop-as-cam1.py163
-rwxr-xr-xexample-scripts/gstreamer/source-remote-videotestsrc-as-cam1.py149
4 files changed, 425 insertions, 368 deletions
diff --git a/example-scripts/gstreamer/source-background-loop.py b/example-scripts/gstreamer/source-background-loop.py
index 2f13edf..4d1dae1 100755
--- a/example-scripts/gstreamer/source-background-loop.py
+++ b/example-scripts/gstreamer/source-background-loop.py
@@ -1,5 +1,8 @@
#!/usr/bin/env python3
-import os, sys, gi, signal
+import os
+import sys
+import gi
+import signal
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject
@@ -8,66 +11,71 @@ from gi.repository import Gst, GObject
GObject.threads_init()
Gst.init([])
+
class LoopSource(object):
- def __init__(self, settings):
- # it works much better with a local file
- pipeline = """
- uridecodebin name=src uri=http://c3voc.mazdermind.de/testfiles/bg.ts !
- videoscale !
- videoconvert !
- video/x-raw,format=I420,width={WIDTH},height={HEIGHT},framerate={FRAMERATE}/1,pixel-aspect-ratio=1/1 !
- matroskamux !
- tcpclientsink host=localhost port=16000
- """.format_map(settings)
-
- print('starting pipeline '+pipeline)
- self.senderPipeline = Gst.parse_launch(pipeline)
- self.src = self.senderPipeline.get_by_name('src')
-
- # Binding End-of-Stream-Signal on Source-Pipeline
- self.senderPipeline.bus.add_signal_watch()
- self.senderPipeline.bus.connect("message::eos", self.on_eos)
- self.senderPipeline.bus.connect("message::error", self.on_error)
-
- print("playing")
- self.senderPipeline.set_state(Gst.State.PLAYING)
-
-
- def on_eos(self, bus, message):
- print('Received EOS-Signal, Seeking to start')
- self.src.seek(
- 1.0, # rate (float)
- Gst.Format.TIME, # format (Gst.Format)
- Gst.SeekFlags.FLUSH, # flags (Gst.SeekFlags)
- Gst.SeekType.SET, # start_type (Gst.SeekType)
- 0, # start (int)
- Gst.SeekType.NONE, # stop_type (Gst.SeekType)
- 0 # stop (int)
- )
-
- def on_error(self, bus, message):
- print('Received Error-Signal')
- (error, debug) = message.parse_error()
- print('Error-Details: #%u: %s' % (error.code, debug))
- sys.exit(1)
+
+ def __init__(self, settings):
+ # it works much better with a local file
+ pipeline = """
+ uridecodebin name=src
+ uri=http://c3voc.mazdermind.de/testfiles/bg.ts !
+ videoscale !
+ videoconvert !
+ video/x-raw,format=I420,width={WIDTH},height={HEIGHT},
+ framerate={FRAMERATE}/1,pixel-aspect-ratio=1/1 !
+ matroskamux !
+ tcpclientsink host=localhost port=16000
+ """.format_map(settings)
+
+ print('starting pipeline ' + pipeline)
+ self.senderPipeline = Gst.parse_launch(pipeline)
+ self.src = self.senderPipeline.get_by_name('src')
+
+ # Binding End-of-Stream-Signal on Source-Pipeline
+ self.senderPipeline.bus.add_signal_watch()
+ self.senderPipeline.bus.connect("message::eos", self.on_eos)
+ self.senderPipeline.bus.connect("message::error", self.on_error)
+
+ print("playing")
+ self.senderPipeline.set_state(Gst.State.PLAYING)
+
+ def on_eos(self, bus, message):
+ print('Received EOS-Signal, Seeking to start')
+ self.src.seek(
+ 1.0, # rate (float)
+ Gst.Format.TIME, # format (Gst.Format)
+ Gst.SeekFlags.FLUSH, # flags (Gst.SeekFlags)
+ Gst.SeekType.SET, # start_type (Gst.SeekType)
+ 0, # start (int)
+ Gst.SeekType.NONE, # stop_type (Gst.SeekType)
+ 0 # stop (int)
+ )
+
+ def on_error(self, bus, message):
+ print('Received Error-Signal')
+ (error, debug) = message.parse_error()
+ print('Error-Details: #%u: %s' % (error.code, debug))
+ sys.exit(1)
+
def main():
- signal.signal(signal.SIGINT, signal.SIG_DFL)
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
- config = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../config.sh')
- with open(config, 'r') as config:
- lines = [ line.strip() for line in config if line[0] != '#' ]
- pairs = [ line.split('=', 1) for line in lines ]
- settings = { pair[0]: pair[1] for pair in pairs }
+ config = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ '../config.sh')
+ with open(config, 'r') as config:
+ lines = [line.strip() for line in config if line[0] != '#']
+ pairs = [line.split('=', 1) for line in lines]
+ settings = {pair[0]: pair[1] for pair in pairs}
- src = LoopSource(settings)
+ src = LoopSource(settings)
- mainloop = GObject.MainLoop()
- try:
- mainloop.run()
- except KeyboardInterrupt:
- print('Terminated via Ctrl-C')
+ mainloop = GObject.MainLoop()
+ try:
+ mainloop.run()
+ except KeyboardInterrupt:
+ print('Terminated via Ctrl-C')
if __name__ == '__main__':
- main()
+ main()
diff --git a/example-scripts/gstreamer/source-nostream-music-from-folder.py b/example-scripts/gstreamer/source-nostream-music-from-folder.py
index a176a7d..c804182 100755
--- a/example-scripts/gstreamer/source-nostream-music-from-folder.py
+++ b/example-scripts/gstreamer/source-nostream-music-from-folder.py
@@ -1,6 +1,12 @@
#!/usr/bin/env python3
-import os, sys, gi, signal, random
-import argparse, logging, pyinotify
+import os
+import sys
+import gi
+import signal
+import random
+import argparse
+import logging
+import pyinotify
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, GLib
@@ -9,189 +15,206 @@ from gi.repository import Gst, GObject, GLib
GObject.threads_init()
Gst.init([])
-class Directory(object):
- def __init__(self, path):
- self.log = logging.getLogger('Directory')
- self.path = path
- self.scheduled = False
- self.rescan()
-
- self.log.debug('setting up inotify watch for %s', self.path)
- wm = pyinotify.WatchManager()
- notifier = pyinotify.Notifier(wm,
- timeout=10,
- default_proc_fun=self.inotify_callback)
-
- wm.add_watch(
- self.path,
- #pyinotify.ALL_EVENTS,
- pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MODIFY,
- rec=True)
-
- GLib.io_add_watch(
- notifier._fd,
- GLib.IO_IN,
- self.io_callback,
- notifier)
-
- def inotify_callback(self, notifier):
- self.log.info('inotify callback %s: %s', notifier.maskname, notifier.pathname)
- if not self.scheduled:
- self.scheduled = True
- GLib.timeout_add(100, self.rescan)
- return True
-
- def io_callback(self, source, condition, notifier):
- notifier.process_events()
- while notifier.check_events():
- notifier.read_events()
- notifier.process_events()
-
- return True
- def is_playable_file(self, filepath):
- root, ext = os.path.splitext(filepath)
- return ext in ['.mp3', '.ogg', '.oga', '.wav', '.m4a', '.flac', 'self.opus']
-
- def rescan(self):
- self.log.info('scanning directory %s', self.path)
- self.scheduled = False
-
- all_files = []
-
- for root, dirs, files in os.walk(self.path):
- files = filter(self.is_playable_file, files)
- files = map(lambda f: os.path.join(root, f), files)
- files = list(files)
-
- self.log.debug('found directory %s: %u playable file(s)', root, len(files))
- all_files.extend(files)
+class Directory(object):
- self.log.info('found %u playable files', len(all_files))
- self.files = all_files
+ def __init__(self, path):
+ self.log = logging.getLogger('Directory')
+ self.path = path
+ self.scheduled = False
+ self.rescan()
+
+ self.log.debug('setting up inotify watch for %s', self.path)
+ wm = pyinotify.WatchManager()
+ notifier = pyinotify.Notifier(
+ wm,
+ timeout=10,
+ default_proc_fun=self.inotify_callback
+ )
+
+ wm.add_watch(
+ self.path,
+ # pyinotify.ALL_EVENTS,
+ pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MODIFY,
+ rec=True
+ )
+
+ GLib.io_add_watch(
+ notifier._fd,
+ GLib.IO_IN,
+ self.io_callback,
+ notifier
+ )
+
+ def inotify_callback(self, notifier):
+ self.log.info('inotify callback %s: %s',
+ notifier.maskname, notifier.pathname)
+ if not self.scheduled:
+ self.scheduled = True
+ GLib.timeout_add(100, self.rescan)
+ return True
+
+ def io_callback(self, source, condition, notifier):
+ notifier.process_events()
+ while notifier.check_events():
+ notifier.read_events()
+ notifier.process_events()
+
+ return True
+
+ def is_playable_file(self, filepath):
+ root, ext = os.path.splitext(filepath)
+ return ext in ['.mp3', '.ogg', '.oga', '.wav', '.m4a',
+ '.flac', 'self.opus']
+
+ def rescan(self):
+ self.log.info('scanning directory %s', self.path)
+ self.scheduled = False
+
+ all_files = []
+
+ for root, dirs, files in os.walk(self.path):
+ files = filter(self.is_playable_file, files)
+ files = map(lambda f: os.path.join(root, f), files)
+ files = list(files)
+
+ self.log.debug('found directory %s: %u playable file(s)',
+ root, len(files))
+ all_files.extend(files)
+
+ self.log.info('found %u playable files', len(all_files))
+ self.files = all_files
+
+ def get_random_file(self):
+ return random.choice(self.files)
+
+ def get_random_uri(self):
+ return 'file://' + self.get_random_file()
- def get_random_file(self):
- return random.choice(self.files)
- def get_random_uri(self):
- return 'file://'+self.get_random_file()
+class LoopSource(object):
+ def __init__(self, directory):
+ self.log = logging.getLogger('LoopSource')
+ self.directory = directory
+
+ pipeline = """
+ audioresample name=join !
+ audioconvert !
+ audio/x-raw,format=S16LE,channels=2,rate=48000,
+ layout=interleaved !
+ matroskamux !
+ tcpclientsink host=localhost port=18000
+ """
+
+ # Parsing Pipeline
+ self.log.debug('creating pipeline\n%s', pipeline)
+ self.pipeline = Gst.parse_launch(pipeline)
+
+ # Selecting inital URI
+ inital_uri = self.directory.get_random_uri()
+ self.log.info('initial track %s', inital_uri)
+
+ # Create decoder-element
+ self.src = Gst.ElementFactory.make('uridecodebin', None)
+ self.src.set_property('uri', inital_uri)
+ self.src.connect('pad-added', self.on_pad_added)
+ self.pipeline.add(self.src)
+
+ # Save pad on the Join-Element
+ self.joinpad = self.pipeline.get_by_name('join').get_static_pad('sink')
+
+ # Binding End-of-Stream-Signal on Source-Pipeline
+ self.pipeline.bus.add_signal_watch()
+ self.pipeline.bus.connect("message::eos", self.on_eos)
+ self.pipeline.bus.connect("message::error", self.on_error)
+
+ self.log.debug('setting pipeline to playing')
+ self.pipeline.set_state(Gst.State.PLAYING)
+
+ def on_pad_added(self, src, pad):
+ self.log.debug('new pad on decoder, setting pad-probe')
+ pad.add_probe(
+ Gst.PadProbeType.EVENT_DOWNSTREAM | Gst.PadProbeType.BLOCK,
+ self.on_pad_event
+ )
+ if self.joinpad.is_linked():
+ self.log.debug('unlinking with joinpad')
+ self.joinpad.unlink(self.joinpad.get_peer())
+
+ clock = self.pipeline.get_clock()
+ if clock:
+ runtime = clock.get_time() - self.pipeline.get_base_time()
+ self.log.debug('setting pad offset to pipeline runtime: %sns',
+ runtime)
+ pad.set_offset(runtime)
+
+ self.log.debug('linking with joinpad')
+ pad.link(self.joinpad)
+
+ def on_pad_event(self, pad, info):
+ event = info.get_event()
+ self.log.debug('event %s on pad %s', event.type, pad)
+
+ if event.type == Gst.EventType.EOS:
+ self.log.debug('scheduling next track and dropping EOS-Event')
+ GObject.idle_add(self.next_track)
+ return Gst.PadProbeReturn.DROP
+
+ return Gst.PadProbeReturn.PASS
+
+ def next_track(self):
+ next_uri = self.directory.get_random_uri()
+ self.log.info('next track %s', next_uri)
+
+ self.src.set_state(Gst.State.READY)
+ self.src.set_property('uri', next_uri)
+ self.src.set_state(Gst.State.PLAYING)
+ return False
+
+ def on_eos(self, bus, message):
+ self.log.info('received EOS-Event on bus, exiting')
+ sys.exit(1)
+
+ def on_error(self, bus, message):
+ self.log.warning('received Error-Event on bus, exiting')
+ (error, debug) = message.parse_error()
+ self.log.warning('Error-Details: #%u: %s', error.code, debug)
+ sys.exit(1)
-class LoopSource(object):
- def __init__(self, directory):
- self.log = logging.getLogger('LoopSource')
- self.directory = directory
-
- pipeline = """
- audioresample name=join !
- audioconvert !
- audio/x-raw,format=S16LE,channels=2,layout=interleaved,rate=48000 !
- matroskamux !
- tcpclientsink host=localhost port=18000
- """
-
- # Parsing Pipeline
- self.log.debug('creating pipeline\n%s', pipeline)
- self.pipeline = Gst.parse_launch(pipeline)
-
- # Selecting inital URI
- inital_uri = self.directory.get_random_uri()
- self.log.info('initial track %s', inital_uri)
-
- # Create decoder-element
- self.src = Gst.ElementFactory.make('uridecodebin', None)
- self.src.set_property('uri', inital_uri);
- self.src.connect('pad-added', self.on_pad_added)
- self.pipeline.add(self.src)
-
- # Save pad on the Join-Element
- self.joinpad = self.pipeline.get_by_name('join').get_static_pad('sink')
-
- # Binding End-of-Stream-Signal on Source-Pipeline
- self.pipeline.bus.add_signal_watch()
- self.pipeline.bus.connect("message::eos", self.on_eos)
- self.pipeline.bus.connect("message::error", self.on_error)
-
- self.log.debug('setting pipeline to playing')
- self.pipeline.set_state(Gst.State.PLAYING)
-
- def on_pad_added(self, src, pad):
- self.log.debug('new pad on decoder, setting pad-probe')
- pad.add_probe(Gst.PadProbeType.EVENT_DOWNSTREAM | Gst.PadProbeType.BLOCK, self.on_pad_event)
- if self.joinpad.is_linked():
- self.log.debug('unlinking with joinpad')
- self.joinpad.unlink(self.joinpad.get_peer())
-
- clock = self.pipeline.get_clock()
- if clock:
- runtime = clock.get_time() - self.pipeline.get_base_time()
- self.log.debug('setting pad offset to pipeline runtime: %sns', runtime)
- pad.set_offset(runtime)
-
- self.log.debug('linking with joinpad')
- pad.link(self.joinpad)
-
- def on_pad_event(self, pad, info):
- event = info.get_event()
- self.log.debug('event %s on pad %s', event.type, pad)
-
- if event.type == Gst.EventType.EOS:
- self.log.debug('scheduling next track and dropping EOS-Event')
- GObject.idle_add(self.next_track)
- return Gst.PadProbeReturn.DROP
-
- return Gst.PadProbeReturn.PASS
-
- def next_track(self):
- next_uri = self.directory.get_random_uri()
- self.log.info('next track %s', next_uri)
-
- self.src.set_state(Gst.State.READY)
- self.src.set_property('uri', next_uri);
- self.src.set_state(Gst.State.PLAYING)
- return False
-
- def on_eos(self, bus, message):
- self.log.info('received EOS-Event on bus, exiting')
- sys.exit(1)
-
- def on_error(self, bus, message):
- self.log.warning('received Error-Event on bus, exiting')
- (error, debug) = message.parse_error()
- self.log.warning('Error-Details: #%u: %s', error.code, debug)
- sys.exit(1)
def main():
- signal.signal(signal.SIGINT, signal.SIG_DFL)
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
- parser = argparse.ArgumentParser(description='Voctocore Music-Source')
- parser.add_argument('directory')
+ parser = argparse.ArgumentParser(description='Voctocore Music-Source')
+ parser.add_argument('directory')
- parser.add_argument('-v|-vv', '--verbose', action='count', default=0,
- help="Also print INFO and DEBUG messages.")
+ parser.add_argument('-v|-vv', '--verbose', action='count', default=0,
+ help="Also print INFO and DEBUG messages.")
- args = parser.parse_args()
+ args = parser.parse_args()
- if args.verbose >= 2:
- level = logging.DEBUG
- elif args.verbose == 1:
- level = logging.INFO
- else:
- level = logging.WARNING
+ if args.verbose >= 2:
+ level = logging.DEBUG
+ elif args.verbose == 1:
+ level = logging.INFO
+ else:
+ level = logging.WARNING
- logging.basicConfig(
- level=level,
- format='%(levelname)8s %(name)s: %(message)s')
+ logging.basicConfig(
+ level=level,
+ format='%(levelname)8s %(name)s: %(message)s'
+ )
- directory = Directory(args.directory)
- src = LoopSource(directory)
+ directory = Directory(args.directory)
+ src = LoopSource(directory)
- mainloop = GObject.MainLoop()
- try:
- mainloop.run()
- except KeyboardInterrupt:
- print('Terminated via Ctrl-C')
+ mainloop = GObject.MainLoop()
+ try:
+ mainloop.run()
+ except KeyboardInterrupt:
+ print('Terminated via Ctrl-C')
if __name__ == '__main__':
- main()
+ main()
diff --git a/example-scripts/gstreamer/source-remote-desktop-as-cam1.py b/example-scripts/gstreamer/source-remote-desktop-as-cam1.py
index 7d1c7f2..4788554 100755
--- a/example-scripts/gstreamer/source-remote-desktop-as-cam1.py
+++ b/example-scripts/gstreamer/source-remote-desktop-as-cam1.py
@@ -1,6 +1,10 @@
#!/usr/bin/python3
-import os, sys, gi, signal
-import argparse, socket
+import os
+import sys
+import gi
+import signal
+import argparse
+import socket
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GstNet, GObject
@@ -9,88 +13,97 @@ from gi.repository import Gst, GstNet, GObject
GObject.threads_init()
Gst.init([])
+
class Source(object):
- def __init__(self, settings):
- pipeline = """
- ximagesrc use-damage=0 startx=0 starty=0 endx=1919 endy=1079 !
- queue !
- videoscale !
- videorate !
- timeoverlay !
- videoconvert !
- video/x-raw,format=I420,width={WIDTH},height={HEIGHT},framerate={FRAMERATE}/1,pixel-aspect-ratio=1/1 !
- queue !
- mux.
-
- pulsesrc !
- audio/x-raw,format=S16LE,channels=2,layout=interleaved,rate={AUDIORATE} !
- queue !
- mux.
-
- matroskamux name=mux !
- tcpclientsink host={IP} port=10000
- """.format_map(settings)
-
- self.clock = GstNet.NetClientClock.new('voctocore', settings['IP'], 9998, 0)
- print('obtained NetClientClock from host', self.clock)
-
- print('waiting for NetClientClock to sync…')
- self.clock.wait_for_sync(Gst.CLOCK_TIME_NONE)
-
- print('starting pipeline '+pipeline)
- self.senderPipeline = Gst.parse_launch(pipeline)
- self.senderPipeline.use_clock(self.clock)
- self.src = self.senderPipeline.get_by_name('src')
-
- # Binding End-of-Stream-Signal on Source-Pipeline
- self.senderPipeline.bus.add_signal_watch()
- self.senderPipeline.bus.connect("message::eos", self.on_eos)
- self.senderPipeline.bus.connect("message::error", self.on_error)
-
- print("playing")
- self.senderPipeline.set_state(Gst.State.PLAYING)
-
-
- def on_eos(self, bus, message):
- print('Received EOS-Signal')
- sys.exit(1)
-
- def on_error(self, bus, message):
- print('Received Error-Signal')
- (error, debug) = message.parse_error()
- print('Error-Details: #%u: %s' % (error.code, debug))
- sys.exit(1)
+
+ def __init__(self, settings):
+ pipeline = """
+ ximagesrc
+ use-damage=0
+ startx=0 starty=0 endx=1919 endy=1079 !
+ queue !
+ videoscale !
+ videorate !
+ timeoverlay !
+ videoconvert !
+ video/x-raw,format=I420,width={WIDTH},height={HEIGHT},
+ framerate={FRAMERATE}/1,pixel-aspect-ratio=1/1 !
+ queue !
+ mux.
+
+ pulsesrc !
+ audio/x-raw,format=S16LE,channels=2,rate={AUDIORATE},
+ layout=interleaved !
+ queue !
+ mux.
+
+ matroskamux name=mux !
+ tcpclientsink host={IP} port=10000
+ """.format_map(settings)
+
+ self.clock = GstNet.NetClientClock.new('voctocore',
+ settings['IP'], 9998,
+ 0)
+ print('obtained NetClientClock from host', self.clock)
+
+ print('waiting for NetClientClock to sync…')
+ self.clock.wait_for_sync(Gst.CLOCK_TIME_NONE)
+
+ print('starting pipeline ' + pipeline)
+ self.senderPipeline = Gst.parse_launch(pipeline)
+ self.senderPipeline.use_clock(self.clock)
+ self.src = self.senderPipeline.get_by_name('src')
+
+ # Binding End-of-Stream-Signal on Source-Pipeline
+ self.senderPipeline.bus.add_signal_watch()
+ self.senderPipeline.bus.connect("message::eos", self.on_eos)
+ self.senderPipeline.bus.connect("message::error", self.on_error)
+
+ print("playing")
+ self.senderPipeline.set_state(Gst.State.PLAYING)
+
+ def on_eos(self, bus, message):
+ print('Received EOS-Signal')
+ sys.exit(1)
+
+ def on_error(self, bus, message):
+ print('Received Error-Signal')
+ (error, debug) = message.parse_error()
+ print('Error-Details: #%u: %s' % (error.code, debug))
+ sys.exit(1)
+
def main():
- signal.signal(signal.SIGINT, signal.SIG_DFL)
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
- parser = argparse.ArgumentParser(description='Voctocore Remote-Source')
- parser.add_argument('host')
+ parser = argparse.ArgumentParser(description='Voctocore Remote-Source')
+ parser.add_argument('host')
- args = parser.parse_args()
- print('Resolving hostname '+args.host)
- addrs = [ str(i[4][0]) for i in socket.getaddrinfo(args.host, None) ]
- if len(addrs) == 0:
- print('Found no IPs')
- sys.exit(1)
+ args = parser.parse_args()
+ print('Resolving hostname ' + args.host)
+ addrs = [str(i[4][0]) for i in socket.getaddrinfo(args.host, None)]
+ if len(addrs) == 0:
+ print('Found no IPs')
+ sys.exit(1)
- print('Using IP '+addrs[0])
+ print('Using IP ' + addrs[0])
- config = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../config.sh')
- with open(config) as config:
- lines = [ line.strip() for line in config if line[0] != '#' ]
- pairs = [ line.split('=', 1) for line in lines ]
- settings = { pair[0]: pair[1] for pair in pairs }
+ config = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ '../config.sh')
+ with open(config) as config:
+ lines = [line.strip() for line in config if line[0] != '#']
+ pairs = [line.split('=', 1) for line in lines]
+ settings = {pair[0]: pair[1] for pair in pairs}
- settings['IP'] = addrs[0]
+ settings['IP'] = addrs[0]
- src = Source(settings)
- mainloop = GObject.MainLoop()
- try:
- mainloop.run()
- except KeyboardInterrupt:
- print('Terminated via Ctrl-C')
+ src = Source(settings)
+ mainloop = GObject.MainLoop()
+ try:
+ mainloop.run()
+ except KeyboardInterrupt:
+ print('Terminated via Ctrl-C')
if __name__ == '__main__':
- main()
+ main()
diff --git a/example-scripts/gstreamer/source-remote-videotestsrc-as-cam1.py b/example-scripts/gstreamer/source-remote-videotestsrc-as-cam1.py
index 5404add..e09f0ec 100755
--- a/example-scripts/gstreamer/source-remote-videotestsrc-as-cam1.py
+++ b/example-scripts/gstreamer/source-remote-videotestsrc-as-cam1.py
@@ -1,6 +1,10 @@
#!/usr/bin/python3
-import os, sys, gi, signal
-import argparse, socket
+import os
+import sys
+import gi
+import signal
+import argparse
+import socket
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GstNet, GObject
@@ -9,83 +13,92 @@ from gi.repository import Gst, GstNet, GObject
GObject.threads_init()
Gst.init([])
-class Source(object):
- def __init__(self, settings):
- # it works much better with a local file
- pipeline = """
- videotestsrc pattern=ball foreground-color=0x00ff0000 background-color=0x00440000 !
- timeoverlay !
- video/x-raw,format=I420,width=1280,height=720,framerate=25/1,pixel-aspect-ratio=1/1 !
- mux.
-
- audiotestsrc freq=330 !
- audio/x-raw,format=S16LE,channels=2,layout=interleaved,rate=48000 !
- mux.
-
- matroskamux name=mux !
- tcpclientsink host={IP} port=10000
- """.format_map(settings)
-
- self.clock = GstNet.NetClientClock.new('voctocore', settings['IP'], 9998, 0)
- print('obtained NetClientClock from host', self.clock)
-
- print('waiting for NetClientClock to sync…')
- self.clock.wait_for_sync(Gst.CLOCK_TIME_NONE)
-
- print('starting pipeline '+pipeline)
- self.senderPipeline = Gst.parse_launch(pipeline)
- self.senderPipeline.use_clock(self.clock)
- self.src = self.senderPipeline.get_by_name('src')
-
- # Binding End-of-Stream-Signal on Source-Pipeline
- self.senderPipeline.bus.add_signal_watch()
- self.senderPipeline.bus.connect("message::eos", self.on_eos)
- self.senderPipeline.bus.connect("message::error", self.on_error)
-
- print("playing")
- self.senderPipeline.set_state(Gst.State.PLAYING)
+class Source(object):
- def on_eos(self, bus, message):
- print('Received EOS-Signal')
- sys.exit(1)
+ def __init__(self, settings):
+ # it works much better with a local file
+ pipeline = """
+ videotestsrc
+ pattern=ball
+ foreground-color=0x00ff0000 background-color=0x00440000 !
+ timeoverlay !
+ video/x-raw,format=I420,width=1280,height=720,
+ framerate=25/1,pixel-aspect-ratio=1/1 !
+ mux.
+
+ audiotestsrc freq=330 !
+ audio/x-raw,format=S16LE,channels=2,rate=48000,
+ layout=interleaved !
+ mux.
+
+ matroskamux name=mux !
+ tcpclientsink host={IP} port=10000
+ """.format_map(settings)
+
+ self.clock = GstNet.NetClientClock.new('voctocore',
+ settings['IP'], 9998,
+ 0)
+ print('obtained NetClientClock from host', self.clock)
+
+ print('waiting for NetClientClock to sync…')
+ self.clock.wait_for_sync(Gst.CLOCK_TIME_NONE)
+
+ print('starting pipeline ' + pipeline)
+ self.senderPipeline = Gst.parse_launch(pipeline)
+ self.senderPipeline.use_clock(self.clock)
+ self.src = self.senderPipeline.get_by_name('src')
+
+ # Binding End-of-Stream-Signal on Source-Pipeline
+ self.senderPipeline.bus.add_signal_watch()
+ self.senderPipeline.bus.connect("message::eos", self.on_eos)
+ self.senderPipeline.bus.connect("message::error", self.on_error)
+
+ print("playing")
+ self.senderPipeline.set_state(Gst.State.PLAYING)
+
+ def on_eos(self, bus, message):
+ print('Received EOS-Signal')
+ sys.exit(1)
+
+ def on_error(self, bus, message):
+ print('Received Error-Signal')
+ (error, debug) = message.parse_error()
+ print('Error-Details: #%u: %s' % (error.code, debug))
+ sys.exit(1)
- def on_error(self, bus, message):
- print('Received Error-Signal')
- (error, debug) = message.parse_error()
- print('Error-Details: #%u: %s' % (error.code, debug))
- sys.exit(1)
def main():
- signal.signal(signal.SIGINT, signal.SIG_DFL)
+ signal.signal(signal.SIGINT, signal.SIG_DFL)
- parser = argparse.ArgumentParser(description='Voctocore Remote-Source')
- parser.add_argument('host')
+ parser = argparse.ArgumentParser(description='Voctocore Remote-Source')
+ parser.add_argument('host')
- args = parser.parse_args()
- print('Resolving hostname '+args.host)
- addrs = [ str(i[4][0]) for i in socket.getaddrinfo(args.host, None) ]
- if len(addrs) == 0:
- print('Found no IPs')
- sys.exit(1)
+ args = parser.parse_args()
+ print('Resolving hostname ' + args.host)
+ addrs = [str(i[4][0]) for i in socket.getaddrinfo(args.host, None)]
+ if len(addrs) == 0:
+ print('Found no IPs')
+ sys.exit(1)
- print('Using IP '+addrs[0])
+ print('Using IP ' + addrs[0])
- config = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../config.sh')
- with open(config) as config:
- lines = [ line.strip() for line in config if line[0] != '#' ]
- pairs = [ line.split('=', 1) for line in lines ]
- settings = { pair[0]: pair[1] for pair in pairs }
+ config = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ '../config.sh')
+ with open(config) as config:
+ lines = [line.strip() for line in config if line[0] != '#']
+ pairs = [line.split('=', 1) for line in lines]
+ settings = {pair[0]: pair[1] for pair in pairs}
- settings['IP'] = addrs[0]
+ settings['IP'] = addrs[0]
- src = Source(settings)
- mainloop = GObject.MainLoop()
- try:
- mainloop.run()
- except KeyboardInterrupt:
- print('Terminated via Ctrl-C')
+ src = Source(settings)
+ mainloop = GObject.MainLoop()
+ try:
+ mainloop.run()
+ except KeyboardInterrupt:
+ print('Terminated via Ctrl-C')
if __name__ == '__main__':
- main()
+ main()