从海康摄像机上读取RTSP视频流并存储当前帧到本地

804 阅读2分钟

整体流程:

1.1 从数据库中获取相机编码
1.2 结合海康平台的AK\SK以及发布的轮子接口获取相机的RTSP
1.3 使用Opencv-Python读取RTSP并存储图像\

模块一:从数据库中获取相机编码

1.1 连接数据库(连接名称、用户名、密码、端口、数据库名称、字符编码、生成游标对象)
1.2 执行Sql语句

import pymysql


class BaseSetMySql():
    # 连接数据库基础参数
    def __init__(self):
        # 连接数据库
        self.conn = pymysql.connect(host='192.168.32.22'  # 连接名称,默认127.0.0.1
                                    , user='root'  ## 用户名
                                    , passwd='root'  # 密码
                                    , port=3306  # 端口,默认为3306
                                    , db='AllIndexcode'  # 数据库名称
                                    , charset='utf8'  # 字符编码
                                    )
        self.cur = self.conn.cursor()  # 生成游标对象

        # Sql语句
        self.Sql = 'SELECT indexcode FROM `cameraid`'  # 查询企业摄像机编码的SQL

    # 获取摄像机编码
    def GetCamID(self):
        try:
            self.cur.execute(self.Sql)  # 执行插入的sql语句
            CamID = self.cur.fetchall()
            return CamID
        except:
            self.conn.commit()  # 提交到数据库执

模块二:根据相机编码获取RTSP

2.1 将获取到的相机ID对海康接口发送POST请求
2.2 筛选海康返回参数中含有RTSP的数据
2.3 这部分的改进可以参考:juejin.cn/post/707626… 这里是关于返回RTSP参数的各种情况

import requests

class BaseSetRTSP():
    def __init__(self):
        # 接口
        self.UrlCode = 'http://xxx.x.xxx.xxx:xxxx/xxxxxxxxx/xxxxxxxxxx'
 
    # 获取企业的RTSP
    def GetRTSP(self,CamId)
        RestInfo = self.UrlCode + CamId
        RestData = requests.get(RestInfo)
        RestDataDict = RestData.json()
        RTSP = None
        RightInfo = "rtsp" in str(RestDataDict)
        if RightInfo is True:
            Data_RestDataDict = ((eval(RestDataDict['data']))['data'])
            RTSP = Data_RestDataDict['url']
        return RTSP

模块三:使用Opencv-Python读取RTSP并存储图像

3.1 需要判定在RTSP模块中获取RTSP是否为None,只有不为None的才会有RTSP 3.2 图像命名采用UUID各种命名避免重复 3.3 这个里面涉及到了一个RTSP连接超时和掉帧现象

import uuid
import cv2


class SaveFrame():
    def __init__(self):
        pass

    # 存视频图像
    def SaveFrame(self, CAMID, RTSP):
        if RTSP is not None:
            VideoCap = cv2.VideoCapture(RTSP)
            ret, frame = VideoCap.read()
            if ret:
                FrameName = "_" + str(CAMID) + "_" + str(uuid.uuid1())
                cv2.imwrite('D:/Pecker/imgs/%s.jpg' % FrameName, frame)
                print("成功截图", FrameName)
            VideoCap.release()