欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-04 21:46:52
...

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

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

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

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

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信息。

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的,就能够和告警的记录对应上了。

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

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

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

在后期TSINGSEE青犀视频研发团队也会完善国标GB28181视频平台EasyGBS视频平台报警联动的功能,将EasyGBS功能做到最优。

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