Created
July 10, 2017 14:10
-
-
Save derpeter/4966ee16ffba1febe70b4279e9b33a5b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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