Spaces:
Sleeping
Sleeping
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 | |
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() |