随笔 - 936  文章 - 0  评论 - 3  阅读 - 30万

国标GB28181协议流媒体视频平台EasyGBS告警信息和告警视频如何实现对应?

之前的博文中我们讲到EasyGBS视频平台已经开发了告警功能,当监测有异常情况时,系统就会自动截取快照并记录时间。但是该功能在实际上线之前,也曾碰到过一些问题,比如告警截取视频的时候出现视频和告警记录对不上的情况。今天就跟大家一起分享下开发过程中问题的解决方法。

因为告警信息是实时的,而视频是需要EasyGBS平台来保存的。存取视频是保存在告警信息来的20秒之后,这时保存的这个视频会和告警记录有一个时间差,而在这个时间差里,可能产生了新的告警信息,所以告警记录和视频会产生偏差。

如何避免这种偏差?我们选择了给告警视频赋予标识的方法,也就是在添加存储告警视频的时候传入告警记录的id,将告警视频和告警记录一一对应起来。以下为参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
modelsAlarm := &models.Alarm{
            DeviceID:      serial,
            ChannelID:     deviceId,
            DeviceName:    device.Name,
            ChannelName:   channels.Name,
            AlarmPriority: alarmPriority,
            AlarmTime:     aTime,
            AlarmMethod:   alarmMethod,
            AlarmType:     alarmType,
            AlarmSnap:     "",
        }
  
        db.SQLite.Create(modelsAlarm)
        fmt.Println(modelsAlarm.ID)
        go doAlarmSnap(c, *channels, serial, modelsAlarm.ID)

  

然后再保存的视频文件名字添加告警id信息。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
alarmRecordKey := fmt.Sprintf("alarm_record_%s_%s", msess.GetDeviceID(), msess.GetChannelID())
            alarmRecordURL := fmt.Sprintf("/alarmrecords/alarm_%d_record_%s_%s.mp4", msess.AlarmID, msess.GetDeviceID(), msess.GetChannelID())
            oldFileName := fmt.Sprintf("alarm_%d_record_%s_%s.h264", msess.AlarmID, msess.GetDeviceID(), msess.GetChannelID())
            newFileName := fmt.Sprintf("alarm_%d_record_%s_%s.mp4", msess.AlarmID, msess.GetDeviceID(), msess.GetChannelID())
            var alarmRecord = redis.Client.Get(alarmRecordKey).Val()
            if alarmRecord != "" {
                inFile := filepath.Join(utils.DataDir(), "alarmrecords", oldFileName)
                outFile := filepath.Join(utils.DataDir(), "alarmrecords", newFileName)
                if _, err := os.Stat(inFile); os.IsNotExist(err) {
                    sms_log.Log.Printf("alarm record h264 to mp4 error, %v", err)
                }
                ff.H264ToMP4(inFile, outFile)
                redis.Client.Del(alarmRecordKey)
                err := models.UpdateAlarmRecord(msess.AlarmID, alarmRecordURL)
                if err != nil {
                    sms_log.Log.Printf("alarm record end error, %v", err)
                }
                msess.AlarmID = 0
                if err := os.Remove(inFile); err != nil {
                    log.Println(err)
                }

  

以上两段代码添加之后,保存下来的视频文件信息就是携带告警id的,就能够和告警的记录对应上了。

告警功能的开发不仅仅是为了让运维人员能够第一时间了解到重要警报,同时还为报警联动的开发带来了新的方向,报警系统被触发后,报警主机给一个信号到联动模块从而打开监控设备和探照灯,监控设备与监控主机的AI(模拟量输入)或DI(开关量输入)通道连接,监控主机一旦收到监控设备的报警信号(模拟量报警的机制即是电压超出事先设定的阈值范围产生报警。

在后期TSINGSEE青犀视频研发团队也会完善国标GB28181视频平台EasyGBS视频平台报警联动的功能,将EasyGBS功能做到最优。TSINGSEE青犀视频专注于计算机视觉、模式识别领域的开发与研究, 涵盖支持ONVIF、RTSP、GB/T28181等多协议、多路数的智能分析服务器。主要产品包括EasyGBS国标视频云服务、EasyDSS互联网视频云服务等 ,同时还拥有EasyDarwin开源社区及开放平台。

EasyDarwin是国内视频流媒体团队TSINGSEE青犀视频开发和维护的开源社区。从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目。

posted on   EasyGBS  阅读(493)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示