使用 "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)
此 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)