This article shows how to stream a local webcam to the browser with Python Flask OpenCV multipart HTTP response.
After launching the following self-contained code with Python, when opening http://127.0.0.1:5000/
I see the webcam is being read (green LED on), I see that a /video_feed
request is done by the browser, but strangely, the print(time.time())
is not displayed and no image is updated on the browser.
Is there something which prevents continuous endless multipart/x-mixed-replace; boundary=frame
requests to be successful?
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 >
<div >
<div >
<h3 >Live Streaming</h3>
<img src="/video_feed" width="100%">
</div>
</div>
</div>
</body>
"""
app.run(debug=True)
CodePudding user response:
Not sure about the reason, but finally it works if and only if I turn debug mode off:
app.run()
instead of
app.run(debug=True)