mock-video-feed / src /utils.py
jukrapopk's picture
python codebase + dockerfile + makefile
90eeca9
import cv2
import numpy as np
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import time
from flask import Response
import cv2
import time
def start_html_stream(output_frame, lock):
def generate():
while True:
with lock:
if output_frame[0] is None:
# TODO: Investigate why if remove this print or time.sleep (but not both at the same time), the stream does not work
# time.sleep(0.5)
print(f"{time.time()} - Frame is None.")
continue
(flag, encoded_image) = cv2.imencode(".jpg", output_frame[0])
if not flag:
continue
yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + bytearray(encoded_image) + b'\r\n')
return Response(generate(), mimetype="multipart/x-mixed-replace; boundary=frame")
def capture_webpage(driver):
screenshot = driver.get_screenshot_as_png()
image = np.frombuffer(screenshot, dtype=np.uint8)
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
height, width, _ = image.shape
new_width = 1920
new_height = int(new_width * height / width)
image = cv2.resize(image, (new_width, new_height))
if new_height > 1080:
start_y = (new_height - 1080) // 2
image = image[start_y:start_y + 1080, :]
return image
def get_webpage_frames(stream_url):
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920x1080")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.get(stream_url)
frames_per_second = 10
frame_interval = 1 / frames_per_second
try:
while True:
image = capture_webpage(driver)
yield image
time.sleep(frame_interval)
finally:
driver.quit()
def get_mjpeg_frames(stream_url):
cap = cv2.VideoCapture(stream_url)
while True:
ret, frame = cap.read()
if not ret:
break
yield frame
cap.release()