我使用 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标头,但不行
我似乎 Tornado 正在尝试获取整个响应正文,然后再将其传递给客户端。
看看@gen.coroutine 或 @web.asynchronous 。