我一直在从事生成视频(30fps)并将其存储在内存中的项目。 我希望它使用Flask流式传输到浏览器,但我不希望视频临时存储在驱动器中。 我尝试使用send_file响应方法,但没有任何结果。 这是app.py:-
from flask import Flask, render_template, Response, send_file
app = Flask(__name__)
def generate_video():
return b'video data in bytes'
@app.route('/')
def home_page():
return render_template('index.html')
@app.route('/static/a.mp4')
def stream_video():
return Response(generate_video(), mimetype='video/mp4')
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
我已经使用“ PLYR”脚本制作了HTML视频播放器。
<html>
<head>
<link
rel="stylesheet"
href="{{ url_for('static', filename='plyr.css') }}"
/>
</head>
<body>
<video id="plyr-video" controls>
<source src="/static/a.mp4" />
<!--<source src="{{ url_for('static',filename='a.mp4') }}" />-->
</video>
<script src="{{ url_for('static', filename='plyr.js') }}"></script>
<script>
plyr.setup("#plyr-video");
</script>
</body>
</html>
答案 0 :(得分:1)
您在flask中用于Web服务器的主脚本将允许您通过/ video_feed路径流式传输每个帧。您不能以字节为单位发送所有视频:
from flask import Flask, render_template, Response, jsonify
from camera import VideoCamera
import cv2
app = Flask(__name__)
video_stream = VideoCamera()
@app.route('/')
def index():
return render_template('index.html')
def generate_video(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\r\n')
@app.route('/video_feed')
def video_feed():
return Response(generate_video(video_stream),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='127.0.0.1', port="5000", debug=True)
然后,您需要使用VideoCamera类来处理每个帧,并在其中可以对帧进行所需的每个预测或处理。我在这里使用了OpenCv和网络摄像头流,但是您可以通过视频对其进行更改。 camera.py 文件:
class VideoCamera(object):
def __init__(self):
self.video = cv2.VideoCapture(0)
def __del__(self):
self.video.release()
def get_frame(self):
ret, frame = self.video.read()
# DO WHAT YOU WANT WITH TENSORFLOW / KERAS AND OPENCV
ret, jpeg = cv2.imencode('.jpg', frame)
return jpeg.tobytes()
和 index.html 文件:
<html>
<head>
<link
rel="stylesheet"
href="{{ url_for('static', filename='plyr.css') }}"
/>
</head>
<body>
<img src="{{ url_for('video_feed') }}" />
</body>
</html>