使用 "multipart mixed replace" HTTP 响应将本地网络摄像头视频流提供给网络

Serving local webcam video stream to web with "multipart mixed replace" HTTP response

article 展示了如何使用 Python + Flask + OpenCV + 多部分 HTTP 响应将本地网络摄像头流式传输到浏览器。

在使用 Python 启动以下自包含代码后,打开 http://127.0.0.1:5000/ 我看到正在读取网络摄像头(绿色 LED 亮起),我看到一个 /video_feed 请求是由浏览器完成的,但奇怪的是, print(time.time()) 没有显示,也没有图像在浏览器上更新。

有什么东西可以阻止连续无休止的 multipart/x-mixed-replace; boundary=frame 请求成功吗?

from flask import Flask, render_template, Response
import cv2, time
app = Flask('hello')
camera = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # CAP_DSHOW because of https://answers.opencv.org/question/234933/opencv-440modulesvideoiosrccap_msmfcpp-682-cvcapture_msmfinitstream-failed-to-set-mediatype-stream-0-640x480-30-mfvideoformat_rgb24unsupported-media/
def gen_frames():  
    while True:
        print(time.time())
        success, frame = camera.read()
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\nContent-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():
    return """
<body>
<div class="container">
    <div class="row">
        <div class="col-lg-8  offset-lg-2">
            <h3 class="mt-5">Live Streaming</h3>
            <img src="/video_feed" width="100%">
        </div>
    </div>
</div>
</body>        
    """
app.run(debug=True)

不确定原因,但最终当且仅当我关闭调试模式时它才有效:

app.run()

而不是

app.run(debug=True)