flask實現rtsp視頻流的讀取並在web界面展示

python中flask框架讀取rtsp在web界面展示畫面

因項目需求,需要從海康攝像頭讀取rtsp實時視頻流並在web界面展示,達到直播的效果,查閱了很多資料,最初採用了其他的方法實現了此項功能,但是對網絡要求過高。
詳情請閱讀:https://blog.csdn.net/weixin_45457983/article/details/109254606

接下來要說的是使用flask框架實現此功能,flask使用代碼:

from flask import Flask, render_template, Response
import cv2

class VideoCamera(object):
    def __init__(self):
        # 通過opencv獲取實時視頻流
        self.video = cv2.VideoCapture("rtsp地址") 
    
    def __del__(self):
        self.video.release()
    
    def get_frame(self):
        success, image = self.video.read()
        # 因爲opencv讀取的圖片並非jpeg格式,因此要用motion JPEG模式需要先將圖片轉碼成jpg格式圖片
        ret, jpeg = cv2.imencode('.jpg', image)
        return jpeg.tobytes()

app = Flask(__name__)


def index():
    # jinja2模板,具體格式保存在index.html文件中
    return render_template('index.html')

def gen(camera):
    while True:
        frame = camera.get_frame()
        # 使用generator函數輸出視頻流, 每次請求輸出的content類型是image/jpeg
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

@app.route('/video_feed')  # 這個地址返回視頻流響應
def video_feed():
    return Response(gen(VideoCamera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')   

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

web前端界面代碼

<html>
  <head>
    <title></title>
  </head>
  <body>
    <img src="http://localhost:5000/video_feed"/>
  </body>
</html>

在此過程中,若前後端分離,有時存在跨域問題,關於flask解決跨域問題,讀着可以直接百度進行處理。
若是在服務器上操作,一定注意5000端口是否被佔用,是否已經開放。

如果對我的文章感興趣,歡迎評論探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章