首页 > 解决方案 > 使用在 VM 上运行的 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): can't open camera by index

代码:
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'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')


@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 服务器,检测用户的相机并请求访问它的权限?感谢您的任何建议。

标签: pythonopencvflaskvideo-streamingvirtual-machine

解决方案


您打开相机的方式只会在运行 Flask 应用程序的机器上打开相机 - 所以它在您的本地机器上工作,但部署到它试图找到相机并失败的服务器。

您需要让 Flask 应用程序提供一些浏览器代码以在用户端打开相机,然后将其作为 HTTP 请求发送到 Flask,此时您可以处理视频。看看这里作为起点,但请记住,将其实时流式传输到您的 Flask 服务器可能非常具有挑战性。

您可能希望将 WebRTC 和 Jitsi 作为进一步的起点。


推荐阅读