summaryrefslogtreecommitdiff
path: root/webui
diff options
context:
space:
mode:
authorSaumit Dinesan <justsaumit@protonmail.com>2023-05-12 05:34:14 +0530
committerSaumit Dinesan <justsaumit@protonmail.com>2023-05-12 05:34:14 +0530
commit20cc2b7130437eceb9c9214db63e6b2391a66142 (patch)
treecd919a3e08bbac025ff5183fe729ce16d5f760f5 /webui
parenta8734e6c94047e38c83acbac6f1405ff0c7b7b3f (diff)
webui: /stream adding start and stop streaming, ensuring stream does not start multiple time
Diffstat (limited to 'webui')
-rw-r--r--webui/website/views.py71
1 files changed, 41 insertions, 30 deletions
diff --git a/webui/website/views.py b/webui/website/views.py
index 3523adf..8e762bb 100644
--- a/webui/website/views.py
+++ b/webui/website/views.py
@@ -2,56 +2,67 @@ from flask import Blueprint, render_template, Response
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
-
views = Blueprint('views', __name__)
streaming = Blueprint('streaming', __name__)
+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()
+
+output = StreamingOutput()
+picam2 = None
+
+def start_streaming():
+ global picam2
+ if picam2 is None:
+ picam2 = Picamera2()
+ picam2.configure(picam2.create_video_configuration(main={"size": (640, 480)}))
+ picam2.start_recording(JpegEncoder(), FileOutput(output))
+
+def stop_streaming():
+ global picam2
+ if picam2 is not None:
+ picam2.stop_recording()
+ picam2 = None
+
+def generate():
+ try:
+ while True:
+ with output.condition:
+ output.condition.wait()
+ frame = output.frame
+ yield (b'--FRAME\r\n'
+ b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
+ except Exception as e:
+ logging.warning('Removed streaming client: %s', str(e))
+
@streaming.route('/stream')
def stream():
- 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()
-
- def generate():
- try:
- while True:
- with output.condition:
- output.condition.wait()
- frame = output.frame
- yield (b'--FRAME\r\n'
- b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
- except Exception as e:
- logging.warning('Removed streaming client: %s', str(e))
-
- output = StreamingOutput()
- picam2 = Picamera2()
- picam2.configure(picam2.create_video_configuration(main={"size": (640, 480)}))
- picam2.start_recording(JpegEncoder(), FileOutput(output))
-
+ start_streaming()
return Response(generate(), mimetype='multipart/x-mixed-replace; boundary=FRAME')
-
@views.route('/')
@views.route('/index.html')
def home():
+ stop_streaming()
return render_template("home.html")
@views.route('/live')
def live():
+ start_streaming()
return render_template("live.html")
views.register_blueprint(streaming, url_prefix='/stream')
+