diff options
author | Saumit Dinesan <justsaumit@protonmail.com> | 2023-05-11 02:18:29 +0530 |
---|---|---|
committer | Saumit Dinesan <justsaumit@protonmail.com> | 2023-05-11 02:18:29 +0530 |
commit | 4a30205c7c2ca5dee773bc41f0cce448c98ad72f (patch) | |
tree | a8413ccea2bf88fbc7e1001410ecb9e7e7e9d722 /webui/stream2.py | |
parent | b7fb654b5257d8fc753b202c3639e94da7d1af20 (diff) |
webui: flask dump
Diffstat (limited to 'webui/stream2.py')
-rw-r--r-- | webui/stream2.py | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/webui/stream2.py b/webui/stream2.py new file mode 100644 index 0000000..67439c8 --- /dev/null +++ b/webui/stream2.py @@ -0,0 +1,95 @@ +#!/usr/bin/python3 + +import io +import logging +import socketserver +from http import server +from threading import Condition + +from picamera2 import Picamera2 +from picamera2.encoders import JpegEncoder +from picamera2.outputs import FileOutput + +PAGE = """\ +<html> +<head> +<title>picamera2 MJPEG streaming demo</title> +</head> +<body> +<h1>Picamera2 MJPEG Streaming Demo</h1> +<img src="stream.mjpg" width="640" height="480" /> +</body> +</html> +""" + + +class StreamingOutput(io.BufferedIOBase): + def __init__(self): + self.frame = None + self.condition = Condition() + + def write(self, buf): + with self.condition: + self.frame = buf + self.condition.notify_all() + + +class StreamingHandler(server.BaseHTTPRequestHandler): + def do_GET(self): + if self.path == '/': + self.send_response(301) + self.send_header('Location', '/index.html') + self.end_headers() + elif self.path == '/index.html': + content = PAGE.encode('utf-8') + self.send_response(200) + self.send_header('Content-Type', 'text/html') + self.send_header('Content-Length', len(content)) + self.end_headers() + self.wfile.write(content) + elif self.path == '/stream.mjpg': + self.send_response(200) + self.send_header('Age', 0) + self.send_header('Cache-Control', 'no-cache, private') + self.send_header('Pragma', 'no-cache') + self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME') + self.end_headers() + try: + while True: + with output.condition: + output.condition.wait() + frame = output.frame + self.wfile.write(b'--FRAME\r\n') + self.send_header('Content-Type', 'image/jpeg') + self.send_header('Content-Length', len(frame)) + self.end_headers() + self.wfile.write(frame) + self.wfile.write(b'\r\n') + except Exception as e: + logging.warning( + 'Removed streaming client %s: %s', + self.client_address, str(e)) + else: + self.send_error(404) + self.end_headers() + + +class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer): + allow_reuse_address = True + daemon_threads = True + + +picam2 = Picamera2() +picam2.preview_configuration.main.size = (640, 480) +picam2.start_preview() + +output = StreamingOutput() +picam2.start_recording(JpegEncoder(), FileOutput(output)) + +try: + address = ('', 8000) + server = StreamingServer(address, StreamingHandler) + server.serve_forever() +finally: + picam2.stop_recording() + picam2.stop_preview() |