python - 使用在 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 服务器,检测用户的相机并请求访问它的权限?感谢您的任何建议。
解决方案
您打开相机的方式只会在运行 Flask 应用程序的机器上打开相机 - 所以它在您的本地机器上工作,但部署到它试图找到相机并失败的服务器。
您需要让 Flask 应用程序提供一些浏览器代码以在用户端打开相机,然后将其作为 HTTP 请求发送到 Flask,此时您可以处理视频。看看这里作为起点,但请记住,将其实时流式传输到您的 Flask 服务器可能非常具有挑战性。
您可能希望将 WebRTC 和 Jitsi 作为进一步的起点。
推荐阅读
- function - 要运行的数据:必须将哪些数据传递给 minikanren 才能获得评估?
- java - Android 自定义属性返回 null
- python - 我将如何扭转这一局面?蟒蛇 3.8
- entity-framework - 在实体框架身份中查询客户端评估
- javascript - 如何在具有管理员权限的 Firebase 中初始化应用程序
- javascript - 在随机位置用 0 填充数组
- reactjs - 使用反应钩子
- webpack - webpack-cli 和 webpack-command 一起使用
- javascript - 反应组件渲染两次?
- python - 将 for 循环从 MATLAB 转换为 Python