from vidgear.gears import CamGear from flask import Flask import threading from utils import start_html_stream import os import time import cv2 import socket def get_video_file(): return os.path.join("videos", "classroom.mp4") video_file = get_video_file() cap = cv2.VideoCapture(video_file) framerate = cap.get(cv2.CAP_PROP_FPS) cap.release() stream = CamGear(source=video_file).start() app = Flask(__name__) output_frame = [None] lock = threading.Lock() PORT = 7860 @app.route('/') def html_stream(): return start_html_stream(output_frame, lock) def start_flask(): app.run(host="0.0.0.0", port=PORT, debug=True, use_reloader=False) def process_stream(): global stream while True: start_time = time.time() frame = stream.read() if frame is None: stream.stop() stream = CamGear(source=video_file).start() continue with lock: output_frame[0] = frame.copy() elapsed_time = time.time() - start_time sleep_time = max(1.0 / framerate - elapsed_time, 0) time.sleep(sleep_time) def main(): flask_thread = threading.Thread(target=start_flask) flask_thread.daemon = True flask_thread.start() stream_thread = threading.Thread(target=process_stream) stream_thread.daemon = True stream_thread.start() flask_thread.join() stream_thread.join() if __name__ == "__main__": main()