Разрешить нескольким пользователям транслировать веб-камеру во Flask
Я написал веб-сайт на Python с использованием фреймворка Flask. Я попытался показать поток видео в реальном времени на веб-сайте, но похоже, что только один клиент может транслировать видео, и даже этот поток не работает через 30 секунд...
Веб-сайт развернут на raspberry pi и имеет 3 рабочих, поэтому я понимаю, что они не могут читать кадры с камеры одновременно. Вот почему я использовал метод синхронизации, который нашел в Интернете, хотя и с указанными выше результатами.
Это соответствующая часть моего кода:
from flask import Flask, render_template, url_for, request, escape, Response
import picamera
from camera import CameraStream
import cv2
app = Flask(__name__)
cap = CameraStream().start()
def gen_frame():
"""Video streaming generator function."""
while cap:
frame = cap.read()
convert = cv2.imencode('.jpg', frame)[1].tobytes()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + convert + b'\r\n') # concate frame one by one and show result
@app.route("/video_feed")
def video_feed():
return Response(gen_frame(), mimetype='multipart/x-mixed-replace; boundary=frame')
Модуль камеры - это копия упомянутого мной синхронизированного метода (ссылка)
Журналы, которые я получаю после того, как позволю нескольким клиентам подключиться и попытаться передать мою камеру:
Jan 03 17:46:41 raspberrypi gunicorn[1567]: File "/usr/lib/python2.7/dist-
packages/werkzeug/wrappers.py", line 82, in _iter_encoded
Jan 03 17:46:41 raspberrypi gunicorn[1567]: for item in iterable:
Jan 03 17:46:41 raspberrypi gunicorn[1567]: File "/home/pi/Desktop/python_scripts/internetdisplay/app.py", line 23, in gen_frame
Jan 03 17:46:41 raspberrypi gunicorn[1567]: frame = cap.read()
Jan 03 17:46:41 raspberrypi gunicorn[1567]: File "/home/pi/Desktop/python_scripts/internetdisplay/camera.py", line 31, in read
Jan 03 17:46:41 raspberrypi gunicorn[1567]: frame = self.frame.copy()
Jan 03 17:46:41 raspberrypi gunicorn[1567]: AttributeError: 'NoneType' object has no attribute 'copy'
Jan 03 17:46:54 raspberrypi gunicorn[1567]: [2020-01-03 17:46:54 +0000] [1567] [CRITICAL] WORKER TIMEOUT (pid:1576)
Jan 03 17:46:54 raspberrypi gunicorn[1567]: [2020-01-03 17:46:54 +0000] [1576] [INFO] Worker exiting (pid: 1576)
Jan 03 17:46:55 raspberrypi gunicorn[1567]: [2020-01-03 17:46:55 +0000] [1593] [INFO] Booting worker with pid: 1593
Я попытался настроить метод чтения из модуля и вернуть None, если кадр равен None. Но результаты были похожи.