繁体   English   中英

在Python3中使用Flask从内存流视频

[英]Stream Video from memory using Flask in Python3

我一直在研究一个生成视频(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 Video Player。

<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>

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM