思路:
1)设置http header Content-Type:multipart/x-mixed-replace; boundary=frame
2)capture camera as jpeg
3)每个jpeg包裹成一个http response片段发送
–frame\r\nContent-Type: image/jpeg\r\n\r\n xxxx(jpeg binary data)xxxx \r\n\r\n
4) HTML页面上写一个<img> src为这个python的action。本示例为/v2
from flask import Flask, Response import cv2 import time width = 2560 height = 1440 class VideoCamera(object): def __init__(self): cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) self.video = cap def __del__(self): self.video.release() def get_frame(self): return self.video.read() app = Flask(__name__) @app.route('/v2') def stream(): def generate(): camera = VideoCamera() while True: ret, frame1 = camera.get_frame() ret, frameData = cv2.imencode('.jpg', frame1, [int(cv2.IMWRITE_JPEG_QUALITY), 60]) yield (b'--frame\r\nContent-Type: image/jpeg\r\n\r\n') yield (frameData.tobytes()) yield (b'\r\n\r\n') time.sleep(0.0333) return Response(generate(), mimetype='multipart/x-mixed-replace; boundary=frame') if __name__ == '__main__': app.run(host='0.0.0.0', debug=True, port=4000)
其中这两句的ret, 必须有:
ret, frame1 = camera.get_frame()
ret, frameData = cv2.imencode(‘.jpg’, frame1, [int(cv2.IMWRITE_JPEG_QUALITY), 60])