#!/usr/bin/python3 import sys import gi gi.require_version('Gst', '1.0') from gi.repository import Gst import time import threading import os import stat def bus_call(bus, msg, *args): if msg.type == Gst.MessageType.EOS: print("End-of-stream") loop.quit() return elif msg.type == Gst.MessageType.ERROR: print("GST ERROR", msg.parse_error()) loop.quit() return return True zoom = 1 direction=1 def quit(): pipeline.send_event(Gst.Event.new_eos()) def unset_preview(): videosrc.set_property("preview-x", 800) videosrc.set_property("preview-y", 600) def set_preview(): videosrc.set_property("preview-x", 0) videosrc.set_property("preview-y", 0) def set_zoom(target): global zoom direction = 1 if target < zoom: direction = -1 target=min(target, 1) target=max(target, 0.50) while abs(target-zoom) > 0.01: #fuck IEEE floats zoom = zoom + direction*0.015 zoom = min(zoom, 1) zoom = max(zoom, 0.50) videosrc.set_property("roi-x", (1-zoom)/2) videosrc.set_property("roi-y", (1-zoom)/2) videosrc.set_property("roi-w", zoom) videosrc.set_property("roi-h", zoom) time.sleep(0.03) def add_client(c): if "192.168" not in c or ":" not in c: print("Invalid client! format is 192.168.Y.Z:XXXX") return cur_clients=sink.get_property("clients").split(",") print(cur_clients) if c in cur_clients: print("Client exists!") return cur_clients.append(c) strclients = ",".join(cur_clients) sink.set_property("clients", strclients) def control(): FIFO="/tmp/picamfifo" if os.path.exists(FIFO) and stat.S_ISFIFO(os.stat(FIFO).st_mode): pass else: os.mkfifo(FIFO) while True: with open(FIFO) as fifo: line=fifo.read().strip() if line=="preview": set_preview() if line=="nopreview": unset_preview() if "zoom=" in line: level = float(line.split("=")[1]) set_zoom(level) if "client=" in line: client = line.split("=")[1] add_client(client) print("Got: ", line) if __name__ == "__main__": # initialization Gst.init(None) videocodec = "queue ! video/x-h264, width=800, height=600, framerate=24/1, profile=high ! h264parse ! rtph264pay config-interval=1" p = "rpicamsrc do-timestamp=true name=src ! "+videocodec+" ! multiudpsink name=out" pipeline = Gst.parse_launch (p) if pipeline == None: print ("Failed to create pipeline") sys.exit(0) videosrc = pipeline.get_by_name ("src") videosrc.set_property("preview", 1) videosrc.set_property("fullscreen", False) videosrc.set_property("bitrate", 300000) videosrc.set_property("rotation", 180) unset_preview() sink = pipeline.get_by_name ("out") sink.set_property("clients", ",".join(["192.168.2.120:5000"])) print(sink.get_property("clients")) # run pipeline.set_state(Gst.State.PLAYING) t = threading.Thread(target=control, daemon=True) t.start() while True: time.sleep(10000) # cleanup pipeline.set_state(Gst.State.NULL)