我正在创建一个Flask应用,其中使用app.response_class函数将视频连续流式传输到网页。我的应用包含三个页面,其中两个与此处相关:index.html(这是启动某种游戏的登录页面)和game.html(通过open-方式显示所玩游戏的实况视频), cv2)。我想要的是呈现index.html的模板,通常使用
呈现@app.route('/')
def index():
return render_template('index.html')
满足特定条件时,从response_class函数中输入。条件是得分[0] == 10或得分[1] == 10,因为这表示游戏已结束。
以下(精简的)代码可处理视频的实时流传输以及分数的更新(此处出于测试目的而对其进行随机更新):
def video_stream():
global score
game_running = True
while game_running:
global game
ok, frame = video_camera.read()
# Mock scoring update
score_black, score_white = np.random.choice([0, 1], 1, p=[0.95,
0.05]), np.random.choice([0, 1], 1, p=[0.95, 0.05])
score[0] += score_black[0]
score[1] += score_white[0]
# Stop condition
if score[0] == 5 or score[1] == 5:
# Stop game and yield last frame
game.stop()
game_running = False
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + global_frame + b'\r\n\r\n')
score = None
# RENDER TEMPLATE FOR INDEX.HTML HERE AND BREAK OUT OF APP_RESPONSE (HOW??)
if ok:
_, jpeg = cv2.imencode('.jpg', frame)
global_frame = jpeg.tobytes()
jpeg = jpeg.tobytes()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + jpeg + b'\r\n\r\n')
@app.route('/video_viewer')
def video_viewer():
return app.response_class(video_stream(),
mimetype='multipart/x-mixed-replace; boundary=frame')
我尝试产生render_template并返回它。但是,当然,此返回值将传递回response_class,从而导致错误?我不知道如何突破response_class函数来呈现此模板。有人有线索吗?