Skip to content

Instantly share code, notes, and snippets.

@derpeter
Created July 10, 2017 14:10
Show Gist options
  • Save derpeter/4966ee16ffba1febe70b4279e9b33a5b to your computer and use it in GitHub Desktop.
Save derpeter/4966ee16ffba1febe70b4279e9b33a5b to your computer and use it in GitHub Desktop.
#!/usr/bin/python3
import sys
import time
import threading
import os
import stat
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstNet', '1.0')
from gi.repository import Gst, GstNet
WIDTH = 1024
HEIGHT = 576
FRAMERATE = 25
SCREEN_WIDTH = 1280
SCREEN_HEIGHT = 720
zoom = 1
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
def set_preview(val):
if val == 0:
videosrc.set_property("preview-x", SCREEN_WIDTH)
videosrc.set_property("preview-y", SCREEN_HEIGHT)
else:
videosrc.set_property("preview-x", 0)
videosrc.set_property("preview-y", 0)
def set_zoom(target):
global zoom
if target < zoom:
direction = -1
else:
direction = 1
target=min(target, 1)
target=max(target, 0.40)
while abs(target-zoom) > 0.01: #fuck IEEE floats
zoom = zoom + direction*0.015
zoom = min(zoom, 1)
zoom = max(zoom, 0.4)
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 control():
FIFO = "/tmp/picamfifo"
if os.path.exists(FIFO):
if stat.S_ISFIFO(os.stat(FIFO).st_mode):
pass
else:
os.remove(FIFO)
os.mkfifo(FIFO)
else:
os.mkfifo(FIFO)
while True:
with open(FIFO) as fifo:
line=fifo.read().strip()
print("Got: ", line)
if "=" not in line:
print("Invalid line.")
continue
key = line.split("=")[0]
val = line.split("=")[1]
if key == "preview":
set_preview(int(val))
if key == "zoom":
set_zoom(float(val))
if __name__ == "__main__":
Gst.init(None)
videocodec = """video/x-h264, width=%d, height=%d, framerate=%d/1,
profile=high ! h264parse""" % (WIDTH, HEIGHT, FRAMERATE)
p = """rpicamsrc sensor-mode=4 bitrate=0 quantisation-parameter=12
do-timestamp=true keyframe-interval=5 name=src ! %s !
matroskamux streamable=true !
tcpserversink host=0.0.0.0 port=5000 sync-method=next-keyframe
blocksize=16384""" % videocodec
# blocksize for performance
# next-keyframe to start sync'd up
pipeline = Gst.parse_launch(p)
if pipeline is None:
print("Failed to create pipeline")
sys.exit(0)
videosrc = pipeline.get_by_name("src")
videosrc.set_property("preview", 1)
videosrc.set_property("preview-w", SCREEN_WIDTH)
videosrc.set_property("preview-h", SCREEN_HEIGHT)
videosrc.set_property("fullscreen", False)
videosrc.set_property("bitrate", 14000000)
videosrc.set_property("rotation", 180)
set_preview(0)
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment