Потоковое видео с помощью сервера Flask, работающего на виртуальной машине

#python #opencv #flask #video-streaming #virtual-machine

#python #opencv #flask #потоковое видео #виртуальная машина

Вопрос:

Я пытаюсь получить доступ к камере клиента при запуске сервера на виртуальной машине (GCP). Когда я запускаю сервер Flask на своей локальной машине, он работает нормально — запрашивает разрешение на доступ к камере, но когда я запускаю сервер Flask на виртуальной машине, он не обнаруживает камеру (я запускаю <vm_ip_adress>:<port_number> в браузере). Вместо этого у меня есть эта информация в журналах:

[ПРЕДУПРЕЖДЕНИЕ: 3] глобальный /tmp/pip-req-build-7m_g9lbm/opencv/modules/videoio/src/cap_v4l.cpp (893) открыть VIDEOIO(V4L2:/dev/video0): не удается открыть камеру по индексу.

код:
app.py

 from flask import Flask, render_template, Response
import cv2

app = Flask(__name__)
camera = cv2.VideoCapture(0) 

def gen_frames():
    while True:
        success, frame = camera.read()
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--framern'
                   b'Content-Type: image/jpegrnrn'   frame   b'rn')


@app.route('/video_feed')
def video_feed():
    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')


@app.route('/')
def index():
    """Video streaming home page."""
    return render_template('index.html')


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5002, debug=True)
 

Мой вопрос: возможно ли таким образом запустить сервер Flask, обнаружить камеру пользователя и запросить разрешение на доступ к ней? Спасибо за любые советы.

Комментарии:

1. Это совершенно не связано с Flask. Камера просто недоступна в виртуальной машине.

Ответ №1:

Способ, которым вы открыли камеру, будет открывать камеру только на компьютере, на котором запущено приложение Flask, поэтому оно работало на вашем локальном компьютере, но при развертывании на сервере оно пытается найти камеру и терпит неудачу.

Вам нужно будет заставить ваше приложение Flask использовать некоторый код браузера для открытия камеры на стороне пользователя, а затем отправить его в Flask в виде HTTP-запроса, после чего вы сможете обработать видео. Посмотрите здесь для отправной точки, но имейте в виду, что потоковая передача его на ваш сервер Flask в режиме реального времени может быть довольно сложной.

Возможно, вы захотите изучить WebRTC и Jitsi в качестве дополнительных отправных точек.