lewis-crawler/Software/houston/RobotStreamer.py

69 lines
1.7 KiB
Python

import subprocess as sp
from Xlib import display, X
from PIL import Image
class Streamer:
def __init__(self):
self.x1, self.y1 = 580, 620
# Create display
self.dsp = display.Display(":0")
# This is the root of the screen
self.root = self.dsp.screen().root
# ffmpeg command
# ffmpeg --stream_loop -1 -re -i ~/INPUT_FILE -vcodec libx264 -profile:v main -preset:v medium -r 30 -g 60 -keyint_min 60 -sc_threshold 0 -b:v 2500k -maxrate 2500k -bufsize 2500k -sws_flags lanczos+accurate_rnd -acodec aac -b:a 96k -ar 48000 -ac 2 -f flv rtmp://rtmp.robotstreamer.com/live/123?key=123
cmd_out = [
"ffmpeg",
"-f",
"image2pipe",
"-vcodec",
"png",
"-r",
"30", # FPS
"-i",
"-", # Indicated input comes from pipe
"-vcodec",
"png",
"-qscale",
"0",
"/tmp/robotstreamer.mp4",
]
# This is the ffmpeg pipe streamer!
self.pipe = sp.Popen(cmd_out, stdin=sp.PIPE)
def getFrame(self):
"""
Returns a single cropped sstv video frame
"""
raw = self.root.get_image(0, 0, self.x1, self.y1, X.ZPixmap, 0xFFFFFFFF)
image = Image.frombytes("RGB", (self.x1, self.y1), raw.data, "raw", "BGRX")
return image
def stream(self):
"""
Actually streams!
"""
while True:
self.getFrame().save(self.pipe.stdin, "PNG")
def __del__(self):
self.dsp.close()
self.pipe.stdin.close()
self.pipe.wait()
if __name__ == "__main__":
myStreamer = Streamer()
myStreamer.stream()