| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #!/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)
|