Python应用实例:通过rtsp取流实时监测海康威视监控摄像机画面是否异常,并记录到Mysql数据库,计算故障到恢复的时间,通过企业微信群机器人推送消息到群里

       单位上千路监控摄像头,全靠人工看画面正不正常,如果用ping来判断有时又会出现摄像机在线,存储却取不到流不能录像,所以写了这个, 目前运行正常,很有效哦,都不用人工报修了,还可以用报表工具统计故障率、维修时长效率等,本人新手,发文记录一下自学历程,各位大神勿喷。

import json
import os
import time
from configparser import ConfigParser
import datetime
import cv2
import requests
import pymysql
#连接数据库
db = pymysql.connect(host="127.0.0.1", user="admin", password="admin", database="test", port=3306)
cursor = db.cursor()


def now():   #取现行时间 到秒
    i = datetime.datetime.now()
    ii = str(i)
    ii = ii[0:19]
    return ii


def readdb(ipaddr):   #读取某ip地址的最新一条数据的conntime字段 也就是取流恢复的时间
    sql = "SELECT conntime FROM jiankong  WHERE ID =(SELECT MAX(ID) FROM jiankong WHERE IP='" + ipaddr + "')"
    cursor.execute(sql)
    result = cursor.fetchall()
    if result != ():
        aa = result[0][0]
    else:
        aa = result
    return aa


def readtime(ipaddr):   #读取某IP地址的最新一条数据的misstime字段 也就是取流失败的时间 
    sql = "SELECT misstime FROM jiankong  WHERE ID =(SELECT MAX(ID) FROM jiankong WHERE IP='" + ipaddr + "')"
    cursor.execute(sql)
    result = cursor.fetchall()
    if result != ():
        aa = result[0][0]
    else:
        aa = result
    return aa

def readusetime(ipaddr):   #读取某IP地址的最新一条数据的fixtime字段 也就是从故障到恢复的时间
    sql = "SELECT fixtime FROM jiankong  WHERE ID =(SELECT MAX(ID) FROM jiankong WHERE IP='" + ipaddr + "')"
    cursor.execute(sql)
    result = cursor.fetchall()
    if result != ():
        aa = result[0][0]
    else:
        aa = result
    return aa

def writemissdb(name, ip):   #新插入一条取流失败的数据,在conntime里写入1 用来判断是否已报修避免重复报修
    sql = "INSERT INTO jiankong (name,ip,misstime,conntime) VALUES ('" + name + "','" + ip + "','" + now() + "','1')"
    result = cursor.execute(sql)
    db.commit()


def writefixdb(ip):   #写入取流恢复时间 并将fixtime写入从故障到恢复的时间
    now2 = usetime(readtime(ip), now())
    sql = "UPDATE jiankong SET conntime ='" + now() + "',fixtime ='" + now2 + "' WHERE ID IN(SELECT * FROM (SELECT MAX(ID) FROM jiankong WHERE IP='" + ip + "') A)"
    result = cursor.execute(sql)
    db.commit()


def usetime(time1, time2):   #计算两个时间的差
    first = datetime.datetime.strptime(time1, "%Y-%m-%d %H:%M:%S")
    last = datetime.datetime.strptime(time2, "%Y-%m-%d %H:%M:%S")
    result = last - first
    result = str(result)
    return result

key =  #群机器人的key
def send_msg(content):
    """艾特全部,并发送指定信息"""
    data = json.dumps({"msgtype": "text", "text": {"content": content, "mentioned_list": ["@all"]}})
    r = requests.post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + key, data,
                      auth=('Content-Type', 'application/json'))
    print(r.json)


#config文件读取
path = os.path.abspath('.')
configpath = path + '\\conf.ini'
exist = os.path.exists(configpath)


def ex(lpath): 
    exi = os.path.exists(lpath)
    return exi

def main():
    try:
        while exist is True:
            conn = ConfigParser()
            conn.read(configpath, encoding='utf-8-sig')
            ip = conn.sections()
            user = conn.get('user', 'user')
            login = conn.get('login', 'admin')
            ip.remove('user')
            ip.remove('login')
            for item in ip:
                img1 = cv2.VideoCapture(login + item + ':554/Streaming/Channels/1')
                ret, img = img1.read()
                if ret:
                    #cv2.imwrite(path + '\\' + item + '.jpg', img)
                    a = 0
                    print(item + "--取流成功")
                    nam = conn.get(item, 'nam')
                    x = readdb(item)
                    y = readtime(item)
                    if x == '1':
                        writefixdb(item)
                        timeuse = readusetime(item)
                        send_msg(nam + "已恢复,本次故障时长" + timeuse)
                      

                else:    #一次取流失败后再取一次,两次失败才确诊
                    img1 = cv2.VideoCapture(login + item + ':554/Streaming/Channels/1')
                    ret, img = img1.read()
                    if not ret:
                        nam = conn.get(item, 'nam')
                        x = readdb(item)
                        # expath = path + nam + '.txt'
                        # # print(expath)
                        if x != "1":
                            print(nam + item + '此摄像机取流失败')
                            send_msg('@所有人  监控画面丢失报警:\n' + nam + ' ' + item + '\n此摄像机取流失败,画面丢失,请安排维修')
                            writemissdb(nam, item)

                            # log = open(expath, 'w')
                            # log.write(str(datetime.datetime.now()))
                            # log.close()
                    else:
                        cv2.imwrite(os.path.join(path, item + '.jpg'), img)
                        print(item + "--取流成功")
                        nam = conn.get(item, 'nam')
                        x = readdb(item)
                        # expath = os.path.join(path, nam + '.txt')
                        # if ex(expath) is True:
                        #     os.remove(expath)
                        if x == '1':
                            writefixdb(item)
                            timeuse = readusetime(item)
                            send_msg(nam + "已恢复,本次维修用时"+timeuse)
        else:
            print('未找到conf.ini,即将退出')
            time.sleep(5)
            os._exit(0)

    except Exception as n:
        print(n)


if __name__ == '__main__':
    main()

conf.ini文件内容

[192.168.0.54]
nam=大门口
[192.168.0.55]
nam=库房
[192.168.0.56]
nam=财务


[user]
user=zhangsan|lisi|wangwu
[login]
admin=rtsp://admin:admin@

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个关于Python编写摄像头类的技术问题,我可以为您解答。 您可以使用OpenCV库来实现打开摄像头并采集画面,使用FFmpeg库来将画面通过管道rtsp服务器上。以下是代码示例: ```python import cv2 import subprocess class Camera: def __init__(self, rtsp_url): self.rtsp_url = rtsp_url self.cap = None self.pipe = None def open(self): self.cap = cv2.VideoCapture(0) if not self.cap.isOpened(): raise Exception("Failed to open camera") self.pipe = subprocess.Popen([ "ffmpeg", "-f", "rawvideo", "-pixel_format", "bgr24", "-video_size", "640x480", "-framerate", "30", "-i", "-", "-vcodec", "libx264", "-preset", "ultrafast", "-tune", "zerolatency", "-f", "rtsp", self.rtsp_url ], stdin=subprocess.PIPE) def close(self): self.cap.release() self.pipe.stdin.close() self.pipe.wait() def read(self): ret, frame = self.cap.read() if not ret: raise Exception("Failed to read frame from camera") self.pipe.stdin.write(frame.tostring()) if __name__ == "__main__": camera = Camera("rtsp://127.0.0.1:8554/test") try: camera.open() while True: camera.read() except Exception as e: print(e) finally: camera.close() ``` 在上面的代码中,我们定义了一个Camera类,它有一个rtsp_url属性表示rtsp服务器地址,以及open、close、read三个方法。在open方法中,我们使用OpenCV库打开摄像头,并使用subprocess库开启一个子进程来执行ffmpeg命令rtsp服务器上。在close方法中,我们释放摄像头资源并关闭子进程。在read方法中,我们从摄像头读一帧画面,并将其写入到ffmpeg子进程的stdin管道中。 在主程序中,我们创建一个Camera对象,并调用open方法打开摄像头和。然后,我们进入一个无限循环,不断调用read方法读摄像头画面。如果出现异常,我们将其捕获并打印出来。最后,我们调用close方法关闭摄像头和。 当然,上面的代码只是一个简单的示例,实际应用中需要根据具体情况进行适当的修改。但是,这个代码片段应该能够帮助您开始使用Python编写摄像头类。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值