Python 如何在flask route中接收网络摄像头视频流?

Python 如何在flask route中接收网络摄像头视频流?,python,python-3.x,html,flask,video-streaming,Python,Python 3.x,Html,Flask,Video Streaming,我正在开发一个具有客户端(html&js)和服务器(flask)的应用程序 客户端将打开网络摄像头(HTML5API)->向服务器发送视频流->服务器将返回带有json/文本流的其他流 我不想做联营 我在研究一些关于视频流的东西,但我发现的每一篇文章和互联网上的每一个例子,都使用OpenCV的网络摄像头或本地视频,并获得实时网络摄像头的视频并发送到服务器 以下是我发现的主要例子 服务器: 从烧瓶导入烧瓶,呈现_模板,响应 进口cv2 app=烧瓶(名称) camera=cv2.VideoCap

我正在开发一个具有客户端(html&js)和服务器(flask)的应用程序 客户端将打开网络摄像头(HTML5API)->向服务器发送视频流->服务器将返回带有json/文本流的其他流

我不想做联营

我在研究一些关于视频流的东西,但我发现的每一篇文章和互联网上的每一个例子,都使用OpenCV的网络摄像头或本地视频,并获得实时网络摄像头的视频并发送到服务器

以下是我发现的主要例子

服务器:


从烧瓶导入烧瓶,呈现_模板,响应
进口cv2
app=烧瓶(名称)
camera=cv2.VideoCapture(0)#我不能使用本地网络摄像头视频或本地源视频,我必须通过http以某种api(flask)路由接收它
def gen_frames():#从摄影机逐帧生成
尽管如此:
成功,帧=摄影机。读取()#读取摄影机帧
如果不成功:
打破
其他:
ret,buffer=cv2.imencode('.jpg',frame)
frame=buffer.tobytes()
产量(b'--帧\r\n'
b'Content-Type:image/jpeg\r\n\r\n'+frame+b'\r\n')#逐帧压缩并显示结果
@应用程序路径(“/video_feed”)
def video_feed():
“”“视频流路由。将其放入img标记的src属性。”“”
返回响应(gen_frames(),
mimetype='multipart/x-mixed-replace;boundary=frame')
@应用程序路径(“/”)
def index():
“”“视频流媒体主页。”“”
返回渲染模板('index.html')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run(host='0.0.0.0')
客户: camera.js

//--------------------
//获取用户媒体代码
//--------------------
navigator.getUserMedia=(navigator.getUserMedia||
navigator.webkitGetUserMedia||
navigator.mozGetUserMedia||
navigator.msGetUserMedia);
var视频;
网络摄像机流;
函数startWebcam(){
if(navigator.getUserMedia){
navigator.getUserMedia(
//约束条件
{
视频:没错,
音频:错误
},
//成功回调
函数(localMediaStream){
video=document.querySelector('video');
video.src=window.URL.createObjectURL(localMediaStream);
webcamStream=localMediaStream;
},
//错误回调
功能(err){
log(“发生以下错误:“+err”);
}
);
}否则{
log(“不支持getUserMedia”);
}  
}
//---------------------
//拍摄快照代码
//---------------------
var画布,ctx;
函数init(){
//获取画布并为其获取上下文
//吸纳
canvas=document.getElementById(“myCanvas”);
context=canvas.getContext('2d');
}
函数快照(){
//将当前图像从视频元素绘制到画布中
context.drawImage(视频,0,0,canvas.width,canvas.height);
webcamStream.stop();
var dataURL=canvas.toDataURL('image/jpeg',1.0);
document.querySelector('#dl btn')。href=dataURL;
$.ajax({
类型:“POST”,
contentType:false,
cache:false,
processData:false,
async:false,
url:“/upload”,
数据:{
imgBase64:数据URL
}
}).完成(功能(o){
console.log('saved');
//如果希望文件在浏览器中可见
//-请用javascript修改回调。所有您需要的
//需要的是返回文件的url,您刚刚保存
//然后将图像放入浏览器中。
});
}
index.html


拍摄当前视频流的快照
单击开始网络摄像头按钮。

启动网络摄像头
拍快照

截图:
另一个问题是,我无法使用快照进行池,我需要将视频流发送到服务器以处理那里的帧

有人知道如何将网络摄像头视频流发送到flask


tks

您可能应该在流生成器周围使用
stream\u with\u context
来流化您的响应。您无法返回常规响应,因为有任何信息告诉客户端不要关闭连接


嘿,这可能有助于在烧瓶中播放视频流

#!/usr/bin/env python
from flask import Flask, render_template, Response
from camera import Camera

app = Flask(__name__)

@app.route('/')
def index():
return render_template('index.html')

def gen(camera):
while True:
    frame = camera.get_frame()
    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(Camera()),
                mimetype='multipart/x-mixed-replace; boundary=frame')

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