From d8d7343f86b66d6c7248316a9305f6cc8f57a786 Mon Sep 17 00:00:00 2001 From: KenwoodFox Date: Thu, 7 Apr 2022 10:36:33 -0400 Subject: [PATCH] This worked --- Software/houston/Pipfile | 13 +++++ Software/houston/Pipfile.lock | 81 +++++++++++++++++++++++++++++++ Software/houston/RobotStreamer.py | 74 +++++++++++++++++++++++----- 3 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 Software/houston/Pipfile create mode 100644 Software/houston/Pipfile.lock diff --git a/Software/houston/Pipfile b/Software/houston/Pipfile new file mode 100644 index 0000000..e7733a1 --- /dev/null +++ b/Software/houston/Pipfile @@ -0,0 +1,13 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +xlib = "*" +pillow = "*" + +[dev-packages] + +[requires] +python_version = "3.10" diff --git a/Software/houston/Pipfile.lock b/Software/houston/Pipfile.lock new file mode 100644 index 0000000..03be06d --- /dev/null +++ b/Software/houston/Pipfile.lock @@ -0,0 +1,81 @@ +{ + "_meta": { + "hash": { + "sha256": "a888620a07623b3edc9dfdd90eaa6568b5676e1b54ecabc03327dc1594607897" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.10" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "pillow": { + "hashes": [ + "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e", + "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595", + "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512", + "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c", + "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477", + "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a", + "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4", + "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e", + "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5", + "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378", + "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a", + "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652", + "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7", + "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a", + "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a", + "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6", + "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165", + "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160", + "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331", + "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b", + "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458", + "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033", + "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8", + "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481", + "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58", + "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7", + "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3", + "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea", + "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34", + "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3", + "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8", + "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581", + "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244", + "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef", + "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0", + "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2", + "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97", + "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717" + ], + "index": "pypi", + "version": "==9.1.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "xlib": { + "hashes": [ + "sha256:60b7cd5d90f5d5922d9ce27b61589c07d970796558d417461db7b66e366bc401", + "sha256:8eee67dad83ef4b82bbbfa85d51eeb20c79d12b119fe25aa1d27bd602ff82212" + ], + "index": "pypi", + "version": "==0.21" + } + }, + "develop": {} +} diff --git a/Software/houston/RobotStreamer.py b/Software/houston/RobotStreamer.py index 5c72491..f0081fc 100644 --- a/Software/houston/RobotStreamer.py +++ b/Software/houston/RobotStreamer.py @@ -1,16 +1,68 @@ +import subprocess as sp + from Xlib import display, X from PIL import Image -# 580 -W,H = 580,620 -x,y = 0, 0 +class Streamer: + def __init__(self): + self.x1, self.y1 = 580, 620 -dsp = display.Display(':0') -try: - root = dsp.screen().root - raw = root.get_image(x, y, W,H, X.ZPixmap, 0xffffffff) - image = Image.frombytes("RGB", (W-x, H-y), raw.data, "raw", "BGRX") - image.save('image.png') -finally: - dsp.close() + # 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()