aboutsummaryrefslogtreecommitdiff
path: root/example-scripts/gstreamer/source-remote-videotestsrc-as-cam1.py
blob: 70e838f8b6b8443a3e7d2560370f1f0e4b730f9a (plain)
  1. #!/usr/bin/python3
  2. import sys, gi, signal
  3. import argparse, socket
  4. gi.require_version('Gst', '1.0')
  5. from gi.repository import Gst, GstNet, GObject
  6. # init GObject & Co. before importing local classes
  7. GObject.threads_init()
  8. Gst.init([])
  9. class Source(object):
  10. def __init__(self, ip):
  11. # it works much better with a local file
  12. pipeline = """
  13. videotestsrc pattern=ball foreground-color=0x00ff0000 background-color=0x00440000 !
  14. timeoverlay !
  15. video/x-raw,format=I420,width=1280,height=720,framerate=25/1,pixel-aspect-ratio=1/1 !
  16. mux.
  17. audiotestsrc freq=330 !
  18. audio/x-raw,format=S16LE,channels=2,layout=interleaved,rate=48000 !
  19. mux.
  20. matroskamux name=mux !
  21. tcpclientsink host={ip} port=10000
  22. """.format(
  23. ip=ip
  24. )
  25. self.clock = GstNet.NetClientClock.new('voctocore', ip, 9998, 0)
  26. print('obtained NetClientClock from host', self.clock)
  27. print('waiting for NetClientClock to sync…')
  28. self.clock.wait_for_sync(Gst.CLOCK_TIME_NONE)
  29. print('starting pipeline')
  30. self.senderPipeline = Gst.parse_launch(pipeline)
  31. self.senderPipeline.use_clock(self.clock)
  32. self.src = self.senderPipeline.get_by_name('src')
  33. # Binding End-of-Stream-Signal on Source-Pipeline
  34. self.senderPipeline.bus.add_signal_watch()
  35. self.senderPipeline.bus.connect("message::eos", self.on_eos)
  36. self.senderPipeline.bus.connect("message::error", self.on_error)
  37. print("playing")
  38. self.senderPipeline.set_state(Gst.State.PLAYING)
  39. def on_eos(self, bus, message):
  40. print('Received EOS-Signal')
  41. sys.exit(1)
  42. def on_error(self, bus, message):
  43. print('Received Error-Signal')
  44. (error, debug) = message.parse_error()
  45. print('Error-Details: #%u: %s' % (error.code, debug))
  46. sys.exit(1)
  47. def main():
  48. signal.signal(signal.SIGINT, signal.SIG_DFL)
  49. parser = argparse.ArgumentParser(description='Voctocore Remote-Source')
  50. parser.add_argument('host')
  51. args = parser.parse_args()
  52. print('Resolving hostname '+args.host)
  53. addrs = [ str(i[4][0]) for i in socket.getaddrinfo(args.host, None) ]
  54. if len(addrs) == 0:
  55. print('Found no IPs')
  56. sys.exit(1)
  57. print('Using IP '+addrs[0])
  58. src = Source(addrs[0])
  59. mainloop = GObject.MainLoop()
  60. try:
  61. mainloop.run()
  62. except KeyboardInterrupt:
  63. print('Terminated via Ctrl-C')
  64. if __name__ == '__main__':
  65. main()