Streaming de video con Gunicorn/Django

Holas,

estoy trantando de stremear una webcam con django. Cuando utilizo el runserver de desarrollo puedo abrir dos ventanas de chrome y tengo el video en ambas ventanas. Pero cuando lo quiero ejecutar con Gunicorn solo lo puedo hacer de a una ventana a la vez, por qué puede ser?

El read de opencv lo tengo en un thread (siguiendo las recomendaciones que hay por internet)

Gracias!

from concurrent import futures
from functools import wraps

import cv2

video_capture = cv2.VideoCapture(0)


def threaded(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        with futures.ThreadPoolExecutor() as executor:
            future = executor.submit(func)
        frame = future.result()
        return frame

    return wrapper

@threaded
def read_camera():
    if not video_capture.isOpened():
        raise RuntimeError()

    status, frame = video_capture.read()

    if status:
        return frame

    raise RuntimeError()


def stream_camera():
    while True:
        frame = read_camera()
        status, jpeg = cv2.imencode(".jpg", frame)

        if not status or jpeg is None:
            raise RuntimeError

        yield b"--frame\r\nContent-Type: image/jpeg\r\n\r\n%b\r\n\r\n" % jpeg.tobytes()

@gzip.gzip_page
def video(request):
    return StreamingHttpResponse(
        stream_camera(),
        content_type="multipart/x-mixed-replace;boundary=frame",
    )

Bueno ya logre hacerlo funcionar. Hay que correr gunicorn o uwsgi con la opcion de 1 solo worker/proceso porque solo un proceso puede acceder a la camara al mismo tiempo. Si se quiere usuarios simultaneos/concurrentes hay que incrementar los threads --threads 5 .

3 Me gusta