使用Flask传输RSTP流工作正常,但是用Tornado托管Flask后无法工作

问题描述 投票:0回答:1

我使用 Flask 创建了一个网页,将 RSTP 视频从摄像头流式传输到网页。

rtspUrl = 'rtsp://user:[email protected]/h264/ch1/sub/av_stream'

def gen_frames():    
    camera = cv2.VideoCapture(rtspUrl)    
    while True:        
        success, frame = camera.read()         
        if not success:
            pass
        else:            
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  

@app.route('/playvideo',methods=['GET'])
def playvideo():
    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__=='__main__':
    app.run(host='0.0.0.0',port=8082)

html代码:

</div>
<img src="{{url_for('playvideo')}}"  width="100%">
</div>

在调试模式下运行Flask时,工作正常。我可以打开网页,视频也可以正常播放。

import sys
import asyncio
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from ZYBpowercfg import app  #my flask project
from tornado.web import RequestHandler, Application

class CORSHandler(RequestHandler):
    def set_default_headers(self):
        self.set_header('Access-Control-Allow-Origin', '*')
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
        self.set_header('Access-Control-Allow-Headers', '*')
        
if sys.platform=='win32':
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
http_server=HTTPServer(WSGIContainer(app))
http_server.listen(8082)
IOLoop.instance().start()

但是,用Tornado托管Flask后,网页无法访问,一直处于持续加载状态。我怀疑Tornado阻塞了流的传输。但不知道问题出在哪里。

我尝试更改http标头,但不行

python-3.x flask video-streaming tornado
1个回答
0
投票

我似乎 Tornado 正在尝试获取整个响应正文,然后再将其传递给客户端。

看看@gen.coroutine 或 @web.asynchronous 。

© www.soinside.com 2019 - 2024. All rights reserved.